2

オブジェクトのプロパティを初期化しようとしています。1つは関数です。これは、ハードコーディングすると機能します。

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]);})
     }
}

'action'プロパティで文字列'subitemdata[i] [1]'が関数'showURL'のパラメータリストに表示されず、'subitemdata'リスト'の実際の値が表示されるようにコードを記述するにはどうすればよいですか?http://link1.com 'および' http://link2.com 'は行いますか?

オブジェクトを初期化する動的な方法を使用しているときに、ハードコードされたオブジェクトのバージョンを再作成することができません。

4

1 に答える 1

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を変更しない限り、配列参照は、それを操作するときに同じものを返します。その特定の時点での配列の値を保持したい場合を除いて、これを行う必要はありません。

于 2013-03-25T15:32:03.520 に答える