JS:立即执行函数

立即执行函数

1
2
3
4
5
//一个匿名函数包裹在一个括号运算符中,后面再跟一个小括号
( function(){…} )()
//等价于
( function (){…} () )
//一个匿名函数后面跟一个小括号,然后整个包裹在一个括号运算符中

注意:

  • 函数体后面要有小括号(),函数体必须是函数表达式而不能是函数声明。
  • ()运算符将匿名函数或函数声明转换为函数表达式。

好处

通过定义一个匿名函数,创建了一个新的函数作用域,相当于创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏污染全局的命名空间。

此时若是想访问全局对象,将全局对象以参数形式传进去即可

1
2
3
(function(window){
...
})(window);

拓展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
for(var i = 0; i<10; i++){
setTimeout(function(){
console.log(i)
});
}
改写:使打印 0-10
//第一种:let
for(let i = 0; i<10; i++){
setTimeout(function(){
console.log(i)
});
}
//第二种:闭包 + 立即执行函数
for(var i = 0; i<10; i++){
(function(a){
setTimeout(function(){
console.log(a)
});
})(i);
}
上面的代码即可实现依次打印出0,1,2,3...
此处利用闭包每次将i的值传入进去,里面使用参数a接受传过来的值
然后setTimeout异步调用,进入异步队列,循环代码很快执行完
然后从异步队列里返回执行后的结果,依次打印出0,1,2,3...

//实现隔1秒依次打印一个结果
for(var i = 0; i<10; i++){
(function(a){
setTimeout(function(){
console.log(a)
});
},1000*a)(i);
}
上面代码在延迟执行时间那块加了一个参数a
a的值每次都会增加1,使时间每次扩大比上次大一倍
从而实现了每隔一秒就打印出一个结果

异步调用:异步代码执行完后结果存放在队列中,等同步代码执行完,再输出结果

-------------本文结束 感谢您的阅读-------------