2013-03-31 4 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 из Öreg пункта #» должно быть а, б и т.д.
Я думаю, что это должно быть начать с this, но я не могу сделать это.

+0

И ваш вопрос ..? – Daedalus

+0

вместо «#name of oReg item #» должно быть «s», но вы не можете написать «s», потому что переменная не существует в самой функции, только в цикле – andrew

+0

@andrew Переменная существует вне цикла, но всегда будет указывать на последний ключ, когда вызывается 'set'. – bfavaretto

ответ

3

Это должно быть s вместо i, но, к сожалению, это не так просто из-за "infamous loop problem". Вы должны создать новую область на каждой итерации (функции создавать области), чтобы иметь возможность ссылаться на каждое значение s. В противном случае ваш сеттер всегда будет возвращать значение последнего ключа объекта.

Следующий код должен это сделать:

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

Смежные вопросы