前端面试遇到的题进行整理!
前端js函数中经常遇到下面这两种写法:
1、(function(){ ... })()
2、(function(){ ... }())
javascript 中没有私有作用域的概念,使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以 (function(){ … })() 内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
想搞懂如上形式的函数形式需要知道几个概念:
- 函数声明:
function fnName() {...} ;
fnName();
使用 function 关键字声明一个函数,再执行一个函数名,叫函数声明。
- 函数表达式:
var fnName = function() { ... } ;
使用 function 关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
- 匿名函数:
实现闭包 , 模拟块级作用域,减少全局变量
function() { ... } ;
使用 function 关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
function (){
console.log("yj");
}
单独运行一个匿名函数,不符合语法要求,执行会报错。
解决方法就是:
(function (str){
//此时会输出jj好帅!
console.log("yj"+str);
})("好帅!")
这就是第一个形式的立即执行函数,其中str 可以进行传值。
匿名函数使用场景:
1.点击事件:
<input type="button" value="点我啊!" id="sub">
<script>
//获得按钮元素
var sub=document.querySelector("#sub");
//给按钮增加点击事件。
sub.onclick=function(){
alert("当点击按钮时会执行到我哦!");
}
</script>
2、在对象定义中:
var obj={
name:"yj",
age:18,
fn:function(){
return "我叫"+this.name+"今年"+this.age+"岁了!";
}
};
console.log(obj.fn());//我叫jj今年18岁了!
3、函数表达式中
//将匿名函数赋值给变量fn。
var fn=function(){
return "我是一只小小小小鸟,怎么飞也飞不高!"
}
//调用方式与调用普通函数一样
console.log(fn());//我是一只小小小小鸟,怎么飞也飞不高!
4、回调函数
setInterval(function(){
console.log("我其实是一个回调函数,每次1秒钟会被执行一次");
},1000);
定时器
5、返回值
//将匿名函数作为返回值
function fn(){
//返回匿名函数
return function(){
return "yj";
}
}
//调用匿名函数
console.log(fn()());//yj
//或
var box=fn();
console.log(box());//yj
模拟块级作用域:
function fn(){
(function(){
var la="啦啦啦!";
})();
console.log(la);//报错---la is not defined
}
fn();
函数声明和函数表达式不同之处在于
1、JavaScript 引擎在解析 JavaScript 代码时会“函数声明提升”当前执行环境(作用域)上的函数声明,而函数表达式必须等到 JavaScript 引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式。
2、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以 fnName() 形式调用。
下一篇是关于就是输出内容的应用:
https://blog.youkuaiyun.com/weixin_38271901/article/details/108276265