立即执行函数的本质及其与闭包的关系
function f1() {
var arr = [];
// 这里是匿名函数的闭包,匿名函数执行时在这里找i这个变量
var i = 0
for (; i < 5; i++) {
// 这里是匿名函数的闭包,匿名函数执行时在这里找i这个变量
arr[i] = function () {
console.log(i);
}
}
return arr;
}
console.log('执行 f1');
f1()[0]();
function f2() {
var arr = [];
for (var i = 0; i < 5; i++) {
// 这里是匿名函数的闭包的父作用域
arr[i] = (function (inew) {
// 这里是匿名函数的闭包
return function () {
// 可以看到这里的i不是立即执行函数传入的值,而是来自闭包的父作用域
console.log('i', i);
// 这里的inew已经与i无关
console.log(inew);
}
})(i); // 核心步骤:对i的值进行计算,传入新的作用域(新作用域有个变量inew),把计算结果赋值给inew,从此以后inew就不关心i的变化了
}
return arr;
}
console.log('执行 f2');
f2()[0]();
function f3() {
var arr = [];
// let提供一个作用域(范围就是for循环的结构体),把变量的值传入作用域的同名参数,该参数覆盖了外部变量,类似于fn2
for (let i = 0; i < 5; i++) {
arr[i] = function () {
console.log(i);
}
}
return arr;
}
console.log('执行 f3');
f3()[0]();