immediately-invoked function expression
一、立即执行函数的特点
1. 执行完成后立即释放;
2. 将函数声明转成表达式,就可以用 “()” 执行符号。
3.()-- 括号里加值,(8)会被理解成表达式,详见 语法编写展示 例子 3
二、立即执行函数的编写
(函数表达式声明)+ ( )立即执行符号,
(function(形参){ statements; })(实参);
(function ( 形参) { statements; } (实参));//W3C建议的编写规范
三、语法编写展示
- 立即执行函数参数的传递
(function(a,b){console.log('a+b:',a+b);}(3,7));
//打印结果:a+b: 10
- 获取立即执行函数的返回值
let add = (function(a,b){return a+b;
}(3,7));
console.log('add:',add);
//打印结果:add: 10
- 常见语法错误
function test(a,b){return a+b;
}();
//语法错误
//不报错
function test(a,b){return a+b;
}(5);
四、经典案列
- 预想是每个匿名函数的 i 不同,即0,1,2,3,4,···至···,9
、、案例
function test(){
var arr = [];
for(var i = 0;i<10 ;i++){
arr[i]=function(){
console.log(" ", i);
};
}
return arr;
}
var myArr = test();
for(var j = 0;j<10;j++){
myArr[j]();
}
//打印的是10个 ( 10 10 10 ······ )
一、纠正的方法:立即执行
function test(){
for(var i = 0;i<10 ;i++){
arr[i]=function(){
console.log(" ", i);
}(i);
}
}
test();
二、纠正的方法:外部传值
function test(){
var arr = [];
for(var i = 0;i<10 ;i++){
arr[i]=function(i){
console.log(" ", i);
};
}
return arr;
}
var myArr = test();
for(var j = 0;j<10;j++){
// 外部给函数传入参数
myArr[j](j);
}
三、纠正的方法:仍是立即执行
把 i 存储在立即执行函数里,
function test(){
var arr = [];
for(var i = 0;i<10 ;i++){
(function(i){
arr[i] = function(){
console.log(i);
}
})(i);
}
return arr;
}
var myArr = test();
for(var j = 0;j<10;j++){
myArr[j]();
}