javascript对象项名称

时间:2013-03-31 22:32:53

标签: javascript this

我有以下javascript代码:

var oReg = new Object;
oReg.a = {size: 762, content: 0};
oReg.b = {size: 342, content: 0};
//...

for (var s in oReg) {
    oReg[s].set = function(i) {
        alert('#name of oReg item#: ' + i);
    }
}

“oReg item#”的#name应该是a,b等 我认为它应该以{{1​​}}开头,但我无法解决。

3 个答案:

答案 0 :(得分:3)

它应该是s而不是i,但不幸的是,由于“infamous loop problem”而不是那么简单。您必须在每次迭代(函数创建范围)上创建新范围,以便能够保持对s的每个值的引用。否则,您的setter将始终返回最后一个对象键的值。

以下代码应该这样做:

for (var s in oReg) {
    oReg[s].set = (function(key) {
        return function() {
            alert('#name of oReg item#: ' + key);
        }
    }(s));
}

答案 1 :(得分:0)

我知道很多人会在代码中看到对eval的调用时开始哭泣,但是在将用户输入投入其中时,这确实很危险。因此:

var oReg = new Object;
oReg.a = {size: 762, content: 0};
oReg.b = {size: 342, content: 0};

for (var s in oReg) {
    eval("oReg[s].set = function(i){alert('oReg."+s+": ' + i);}");
}

答案 2 :(得分:0)

var oReg = new Object;
oReg.a = {size: 762, content: 0};
oReg.b = {size: 342, content: 0};
//...

for (var s in oReg) {
    oReg[s].set = (function(s) {
        alert('#name of oReg item#: ' + s);
    })(s);
}

我想你试着这样做。