【问题标题】:Updating contextual array in Javascript closure在 Javascript 闭包中更新上下文数组
【发布时间】:2014-01-07 08:47:55
【问题描述】:

我有这段简单的代码:

function test(){
   var test_array = []
   return function(i){
     test_array.push(i);
     alert(test_array.length);
   };
 }

由于上下文绑定到闭包,我希望代码在每次调用匿名函数时更新数组的长度。然而,这并没有发生。如果我像这样多次调用闭包:

test()(1);
test()(2);

警报始终显示长度为 1。 你能解释一下为什么吗?
谢谢

【问题讨论】:

    标签: javascript arrays closures


    【解决方案1】:

    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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多