立即执行函数
立即执行函数的主要作用就是创建一个立即执行的拥有独立作用域函数,这样可以避免变量污染。
立即执行函数写法
(function (num) {
console.log(num);
}(1));//1 (function(形参){函数体;}(传值));
(function (num) {
console.log(num);
})(2);//2 (function(形参){函数体;})(传值);
! function (num) {
console.log(num);
}(3); //3 !function(形参){函数体;}(传值);
+ function (num) {
console.log(num);
}(4); //4 + function(形参){函数体;}(传值);
- function (num) {
console.log(num);
}(5);//5 - function(形参){函数体;}(传值);
~ function (num) {
console.log(num);
}(6);//6 ~ function(形参){函数体;}(传值);
void function (num) {
console.log(num);
}(7);//7 void function(形参){函数体;}(传值);
new function (num) {
console.log(num);
}(8);//8 new function(形参){函数体;}(传值);
立即执行函数作用
举例:
for (var i = 1; i <= 6; i++) {
setTimeout(function print() {
console.log(i);
}, 1000);
}
//预期结果:1 2 3 4 5 6
//实际结果:6 6 6 6 6 6
解释:虽然setTimeout的回调函数是异步的,但for循环是同步的且立即执行的,所以当setTimeout回调函数执行时,此时的i早已循环完变成6了。
解决方案
for (var i = 1; i <= 6; i++) {
(function(num) { //num为形参
setTimeout(function print() {
console.log(num);
}, 1000);
})(i); //给形参num传值
}
//预期结果:1 2 3 4 5 6
//实际结果:1 2 3 4 5 6
其实还有很多方式都可以创建独立作用域,这里为了演示立即执行函数的作用就只写了这种方法。