前言 :
??闭包非常容易理解但是为什么面试做题总错?? 还是那句话注意细节。
?下面来看两段代码(面试真题)
? 1 问log打印出的是什么
function fn() {
arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function() {
return i;
}
}
return arr
}
var list = fn();
for (var i = 0; i < list.length; i++) {
console.log(list[i]());
}
?
? 知道这一点后如果不够细心也是非常容易出错的比如
?2? log(list)输出的是什么?
function fn() {
arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function() {
return i;
}
}
return arr[0]();
}
var list = fn();
console.log(list);
?
?3 log(arr)输出的是什么
function fun() {
var sum = 10;
var arr = [];
setTimeout(function() {
arr.push(sum);
}, 0);
sum = 20;
return arr;
}
var arr = fun();
console.log(arr);
?
答案:
1??有点基础的人在仔细看过后应该能得出答案55555? ? 因为arr[i] = function() {}在赋值的时候并没有被执行 在被list[i]()执行后从闭包函数内的i值已经被加载为5?
2? 一不小心就会脱口而出0 函数内执行了arr[0]();?? 注意是立即执行 所以说输出的还是5
3 答案:[20]?所有的回调函数,异步任务都不可能是立即执行函数?
总结 当未被立即执行时找的都是闭包函数内该变量最后的状态?
|