闭包:
- 结合面试回答的时候:
- 项目中是否用到,用到有什么两点。
函数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
);
}