在面试过程中经常问到闭包,来判断你对js的熟悉程度,以及使用场景
闭包基本上是内部函数可以访问其范围之外的变量,闭包可用于实现隐私和函数工厂
大部分的案例是这样的,编写一个函数,该函数将遍历整数列表,并在延迟3秒后打印每个元素的索引
被错误的写成这样的代码:
const arrkkb = [1, 2, 7, 11];
for (var i = 0; i < arrkkb.length; i++) {
setTimeout(function() {
console.log('The index of this number is: ' + i);
}, 3000);
}
复制代码
按照运行上面的代码 3秒延迟之后执行打印的结果输出为4个4 ,而不是期望的0,1,2,3
为了正确的解释这种的情况,为什么会在js中得出这样的结果,这正是面试官视图测试的内容,
解释如下:
setTimeout函数创建了一个可以访问其外部作用域的函数(闭包),该作用域是包含索引i的循环,经过3秒之后,执行该函数并打印出i的值,该值在循环结束时为4,因为它循环经过0,1,2,3,4并且循环最终停止在4,
实际上有很多方法来正确解释:
const arrkkb = [1, 2, 7, 11];
for (let i = 0; i < arrkkb.length; i++) {
setTimeout(function() {
console.log('The index of this number is: ' + i);
}, 3000);
}
复制代码
解释二
const arrkkb = [1, 2, 7, 11];
for (var i = 0; i < arrkkb.length; i++) {
setTimeout(function(i_l){
return function () {
console.log('The index of this number is: ' + i_local);
}
}(i), 3000)
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END