闭包:
-
结合面试回答的时候:
- 项目中是否用到,用到有什么两点。
-
理解:正常情况下,作用域只会单独出现,要么全局作用域,要么函数作用域,但是两个函数嵌套形成了作用域的交叉,所以出现了闭包的概念。
函数A中有一个函数B,函数B能够访问到函数A的变量,函数B就是闭包。
概念上就是:闭包就是能够访问另一个函数作用域变量的函数。
在JS中函数中,定义一个函数,函数内查找变量只能在自身函数作用域找,找不到则到window中查找。
但是闭包的函数是可以访问到另一个函数作用域中的变量。
闭包存在的意义:
能够访问到函数内部的变量
for (var i = 1; i <= 5;i++){
setTimeout(
function timer(){console.log(i)},
i * 1000
)
}
因为setTimerout是异步的,所以for循环会先执行完毕,i为6,所以输入一堆6;
如果修改函数让其依次输出
方法1:let+作用域
for (let i = 1; i <= 5; i++) {
setTimeout(() => {
console.log(i);
}, i * 1000);
}
方法2: 自调+闭包
for (var i = 1; i <= 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j);
}, j * 1000);
})(i);
}
方法3:setTimeout第三个参数
for (var i = 1; i <= 5; i++) {
setTimeout(
(i) => {
console.log(i);
},
i * 1000,
i
);
}
/*
变量i的查找:从for的()中找到了
*/
var data = [];
for ( var i = 0; i < 3; i++ )
{
data[i] = function () {
console.log( i );
};
}
data[0]();
data[1]();
data[2]();