【问题标题】:passing array value using closure使用闭包传递数组值
【发布时间】:2013-03-04 22:44:26
【问题描述】:

从另一个函数获取多个本地数组的最佳方法是什么。我正在做类似的事情。至于附加到函数的变量名“arr1=f1()”,是否需要将它们声明为本地“var arr1=f1()”。

<script>

    function ArrValues(arr){
        var array=arr;
        function f1(){
            var ID=[];
            ID=['grapes','peaches','plums'];
            return ID
        };
        function f2(){
            var Nam=[]; 
            Nam=['car','motorcycle','tree'];
            return Nam
        };
        function f3(){
            var Num=[]; 
            Num=['200','1000','350'];
            return Num
        };

        if(array=='one' || array=='all'){ arr1=f1()};
        if(array=='two' || array=='all'){ var arr2=f2()};
        if(array=='three' || array=='all'){ var arr3=f3()};

        gotIt(arr1,arr2,arr3)
    }

    function gotIt(arr1,arr2,arr3){
        alert(arr1);
        alert(arr2);
        alert(arr3);
    }

</script>

<div id="one" onclick="ArrValues(this.id)">one</div>
<div id="two" onclick="ArrValues(this.id)">two</div>
<div id="three"onclick="ArrValues(this.id)">three</div>
<div id="all"onclick="ArrValues(this.id)">all</div>

【问题讨论】:

  • 总是在范围的顶部使用var,或者至少在一个逻辑位置(例如在for的顶部,记住它无论如何都被吊起)。很难按原样写。如果没有 var 注释,标识符将被解析为“全局”。因为它 (arr1) 之前没有被分配,所以如果第一个分支永远无法到达,它将在此处产生 ReferenceError。搜索[javascript] var hoist 有很多相关问题。
  • (去掉&lt;div id="one" ..&gt;元素可以看到ReferenceError。)

标签: javascript arrays closures


【解决方案1】:

这取决于。由于您将值直接传递给gotIt,因此您似乎不需要全局使用它们,因此应该在所有这些值上都有var

也就是说,您的代码非常混乱而且有点多余。试试这个:

function ArrValues(arr) {
    var arr1 = arr=='one' || arr=='all' ? ['grapes','peaches','plums'] : [],
        arr2 = arr=='two' || arr=='all' ? ['car','motorcycle','tree'] : [],
        arr3 = arr=='three' || arr=='all' ? ['200','1000','350'] : [];
    gotIt(arr1,arr2,arr3);
}

请注意,我已为每个数组指定了一个空数组的默认值,否则您最终会得到未定义的变量。

【讨论】:

  • case 语句会更清晰,并删除all 冗余。
  • 感谢您的快速响应。这看起来比我的 Kolink 干净得多。 case 语句听起来不错,但如果我有大量数组,在我添加新数组时,它们的顺序不会更难更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多