将数组存储在闭包中

时间:2013-03-05 05:54:25

标签: javascript arrays closures

这是使用闭包更新数组的最佳方法吗?我在另一个网站上看到了类似的东西。我想知道创建的全局变量closure1。有没有办法在不创建全局的情况下做到这一点。

<script>  
    var closure1=Closure(0, 0);

    function Closure(num, i) {
        var num=num;
        var index=i;
        var anArray = [];
        return function(num,index) {
          anArray[index]=(num);
          out.innerHTML=anArray;
        }
    } 
 </script>

<div id="d1" onclick=" closure1(2,0)">2 index 0</div>
<div id="d2" onclick=" closure1(5,3)">5 index 3</div>
<div id="d3" onclick=" closure1(4,1)">4 index 1</div>
<div id="d4" onclick=" closure1(9,7)">9 index 7</div>
<div id="out" >?</div>

2 个答案:

答案 0 :(得分:0)

我认为你可以做这样的事情。如果您不想创建全局变量,请将脚本包装在自执行函数中。

(function(){
      var closure1=Closure(0, 0);

      function Closure(num, i) {
        var num=num;
        var index=i;
        var anArray = [];
        return function(num,index) {
          anArray[index]=(num);
          out.innerHTML=anArray;
        }
      }
  }()); 

答案 1 :(得分:0)

您需要有一种方法来调用您创建的闭包,以便在onclick属性中使用它。将closure1作为全局变量的优点是闭包只创建一次,您可以通过调用closure1(num, index)在页面中重复使用它。但是,如果您不希望在全局范围内使用名为closure1的变量,则可以通过以下方式清理

编辑:我之前发布了两种建议的方法。感谢@nnnnnn指出其中一种方法会破坏OP的代码。我删除了错误的建议,并保留了正确的建议。

您可以将闭包添加为现有Closure函数的属性。例如,如果要创建新的闭包closure1,则应该像这样创建它

删除该行:

var closure1=Closure(0, 0);

添加以下行 AFTER 已定义Closure函数,如下所示:

Closure.closure1 = Closure(0, 0);

并用

替换你的onclicks
<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div>

完整的代码如下所示:

<script>  
    function Closure(num, i) {
        var num=num;
        var index=i;
        var anArray = [];
        return function(num,index) {
          anArray[index]=(num);
          out.innerHTML=anArray;
        }
    } 

    Closure.closure1 = Closure(0, 0);
 </script>

<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div>
<div id="d2" onclick="Closure.closure1(5,3)">5 index 3</div>
<div id="d3" onclick="Closure.closure1(4,1)">4 index 1</div>
<div id="d4" onclick="Closure.closure1(9,7)">9 index 7</div>
<div id="out" >?</div>

在我看来,这是最干净的方法。希望这会有所帮助。