-1

我有以下 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);
    }
}

“#name of oReg item#”应该是 a、b 等
我认为它应该以 开头this,但我无法弄清楚。

4

3 回答 3

3

它应该s代替i,但不幸的是,由于“臭名昭著的循环问题”,它并不是那么简单。您必须在每次迭代时创建一个新范围(函数创建范围),以便能够保留对s. 否则,您的 setter 将始终返回最后一个对象键的值。

下面的代码应该做到这一点:

for (var s in oReg) {
    oReg[s].set = (function(key) {
        return function() {
            alert('#name of oReg item#: ' + key);
        }
    }(s));
}
于 2013-03-31T22:37:45.210 回答
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);}");
}
于 2013-03-31T22:40:34.333 回答
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);
}

我想你试着这样做。

于 2013-03-31T22:42:31.603 回答