首先闭包的形成的条件:
1.有两个函数
2.两个函数是嵌套关系
3. 内部的函数调用了内部函数的变量
其次变量的查找规则:沿着作用域链逐层往外面查找,直到找到全局的,(属性找不到为undefind,变量为err)
最重要的一句话:js函数在运行的时候在他们被定义的作用域中,而不是被执行的作
下面进入正题,这是一个面试题:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[1](); //10
console.log(i) //10
console.log(a[1]); //function(){console.log(i)}
使用var声明的变量i ,没有形成一个块级的作用域,所以里面的funciton不能形成一个闭包,每次也不会保存i的值
只有当a[i]()这个函数执行的时候,funciton会沿着作用域链查找i的值,父级作用域就是window,这个时候i已经加到了10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //6
console.log(a[6]); // function(){console.log(i)}
let 声明的变量,属于块级作用域,声明周期就在大括号中,在外部是不可以打印的,所以funciton在内部就形成了一个闭包,
funciton里面可以引用父级作用域的变量,引用的就是funciton被定义时的父作用域的变量值
所以在执行a[i] = function () { console.log(i);}的时候 fucniton都保存了当时的i值