今天和同事聊天的时候,不经意间说起了JS。同事就给出了一段比较有意思的代码让我判断结果:
var data = [];
function test () {
for (var i = 0; i < 3 ; i ++) {
data[i] = function () {
return i;
};
}
}
test();
alert(data[0]());
alert(data[1]());
alert(data[2]());
大家判断下这三个alert分别会输出什么内容呢?
我全猜错了。
这段代码执行的结果是三个都会输出“3”。
由于JS知识的匮乏,我没有理解这其中的原理所在,我在上述代码之后,将data[0]、data[1]、data[2]打印出来后,发现三个的内容都是如下函数:
function () {
return i;
}
原来这是因为每个data中的函数都保存了这个局部变量i的引用,因此导致其没有被JS垃圾回收机制回收,内存中仍然存在这个变量。而在for循环结束后,i的值已经变为了3,也就是说data中每个函数里的i都等于3,因此就会出现上述情况。
因为JS的特性,导致闭包只能取得函数中变量的最后一个值。
书到用时方恨少,平时学习知识都是浅尝辄止,会用就行,一旦遇到需要追寻到根源的问题时,就变得束手无策了。看来基础知识必须得打牢啊。