在使用函数作为属性初始化对象时,参数是变量的名称而不是其值

时间:2013-03-25 15:22:13

标签: javascript object function-parameter

我试图初始化一个对象的属性,一个是一个函数。 如果我对其进行硬编码,这是有效的:

subitems = {
   "1" : { "label": "Link1",
           "action": function(obj) {showURL(obj,"http://link1.com")}
   },
   "2" : { "label": "Link2",
           "action": function(obj) {showURL(obj,"http://link2.com")}
   }
}

或者如果我尝试使用变量中的列表动态地执行它

subitemdata = [['Link1','http://link1.com'],['Link2','http://link2.com']];

我用它来填充标签和动作属性并生成对象

subitems = {};
for (i=0; i<subitemdata.length;i++) {
    subitems[i] = {};
    subitems[i].label = subitemdata[i][0];
    subitems[i].action = function(obj) {showURL(obj,subitemdata[i][1])};
}

我得到了

subitems = {
     0 : { label: "Link1",
           action: (function(obj) {showURL(obj,subitemdata[i][1]);})
     },
     1 : { label: "Link2",
           action: (function(obj) {showURL(obj,subitemdata[i][1]);})
     }
}

如何编写代码以便在&#39; action&#39;属性字符串&#39; subitemdata [i] [1]&#39;不会出现在功能&#39; showURL&#39;的参数列表中。但是来自&subartmdata&#39;的实际值。列表&#39; http://link1.com&#39;和&#39; http://link2.com&#39;做?

在使用动态方式初始化对象时,我无法重新创建硬编码对象版本。

1 个答案:

答案 0 :(得分:4)

subitem[i].action = (function makeConstantStr(str){
    //this takes the array, gets the value and returns a new function with
    //the current value in the array as the 2nd argument of the innermost function
    return function(obj) {showURL(obj,str)};
}(subitemdata[i][1]));

如果将它包装在一个立即调用的函数中并传入值,它应立即对其进行求值,并将参数设置为数组内容的值而不是数组引用本身。

只是为了确保你清楚,只要你不修改subitemdata,数组引用将在你使用它时返回相同的东西。除非您想在特定时刻保留数组的值,否则不需要这样做。