闭包
涉及面试题:什么是闭包?
定义:函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。
闭包:有权访问另一个函数作用域中的变量的函数;一般情况就是在一个函数中包含另一个函数。
在 JS 中,闭包存在的意义就是让我们可以间接访问函数内部的变量
面试题,循环中使用闭包解决
var
定义函数的问题
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}
// 这里会输出 5个6
解析:这里会输入5个6,因为i
是用var 定义,且 settimout
是异步方法,所以会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。
解决方法一:闭包
for (var i = 1; i <= 5; i++) {
(function(j){
setTimeout(function timer() {
console.log('iief',j)
}, j * 1000)
})(i)
}
方法二: let
// let 方式
for (let i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log('let',i)
}, i * 1000)
}
方法三: 使用 setTimeout
的第三个参数,这个参数会被当成 timer
函数的参数传入。
for (var i = 1; i <= 5; i++) {
setTimeout(
function timer(j) {
console.log(j)
},
i * 1000,
i
)
}