2013-03-31 80 views
-1

我有以下的javascript代码: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”应该是A,B等
我认为它应该被this开始,但我不能想出来。

+0

而你的问题是..? – Daedalus

+0

而不是“oReg项#的#name”应该是“s”,但是你不能写“s”,因为变量不存在于函数本身中,只在循环中 – andrew

+0

@andrew该变量确实存在于循环外部,但是当'set'被调用时它总是指向最后一个键。 – bfavaretto

回答

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)); 
} 
+0

非常感谢,解决问题 – andrew

+0

@andrew:不要忘记您点击旁边的复选标记以接受此问题。 –

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);}"); 
} 
+1

*“在将用户输入引入它时真的很危险”* ...您是对的,但还有其他一些避免“eval”的原因:编译器运行速度慢,编译器难以优化,代码难以维护。 –

+0

接受的评论,我想我今天再学到一些东西:)取而代之的是bfavaretto的回答。 – tomsmeding

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

我想你想做到这一点。

+0

这将在每次迭代时发出警报,并且对于每个密钥,“set”都是未定义的。 – bfavaretto