我有这段简单的代码:
function test(){
var test_array = []
return function(i){
test_array.push(i);
alert(test_array.length);
};
}
由于上下文绑定到闭包,我希望每次调用匿名函数时代码都会更新数组的长度。然而,这并没有发生。如果我像这样多次调用闭包:
test()(1);
test()(2);
警报始终显示长度为1。 你能解释一下为什么吗? 谢谢
答案 0 :(得分:4)
每次调用test
都会创建一个 new 执行上下文,其中包含 new 数组和关闭该上下文的 new 函数(包括数组)。
如果保存对函数test
的引用返回然后重复调用相同的函数,它将更新由创建函数的test
调用创建的数组,你会看到什么你期待:
var f = test();
f(); // 1
f(); // 2
当然,您可以拥有多个:
var first = test();
var second = test();
first(); // 1
first(); // 2
first(); // 3
second(); // 1
first(); // 4