前言 :
闭包非常容易理解但是为什么面试做题总错?? 还是那句话注意细节。
下面来看两段代码(面试真题)
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] 所有的回调函数,异步任务都不可能是立即执行函数
总结 当未被立即执行时找的都是闭包函数内该变量最后的状态