2010-07-20 2 views
2

Я использовал оба в javascript ... действительно не знаю разницы. Googling всегда показывает результаты для «оконного объекта» или «открытия нового окна в javascript», поэтому ничего там не найти.Разница между окном [] и eval() - Javascript

eval("v"+e) 
window["v"+e] 

Иногда окно работает для меня, и в другие времена Eval работ ....

Так что разница между Eval() и окно []?

Извините за вопрос о новичке!

Norman

+2

Не могли бы вы заявить, что в качестве вопроса, пожалуйста? В частности, что вы действительно спрашиваете? – Robusto

+0

Независимо от ответа, не используйте eval! – jasongetsdown

+0

Я думаю, что довольно ясно, что вопрос: «Пожалуйста, объясните мне ситуацию». – Grumdrig

ответ

4

Еще один момент, который не был рассмотрен, что eval рассосется переменные ссылки с помощью переменной среды абонентя, например:

var foo = "global"; 

(function() { 
    var foo = "local"; 
    alert(eval("foo")); // alerts "local" 
    alert(window["foo"]); // alerts "global" 
})(); 

так как вы можете видеть, не полностью эквивалентны.

Если вы просто хотите ссылаться на глобальную переменную , я бы порекомендовал вам использовать подход window[prop] и избегать сюрпризов.

+0

Итак, для доступа к локальным переменным используйте окно в противном случае используйте eval? ... почему так много людей препятствуют использованию eval? есть ли другой способ доступа к локальным переменным, таким как eval («ev» + d); где d = 1 локально, и я хочу получить доступ к значению локальной переменной ev1? – Norman

+0

@Norman, для доступа к глобальным переменным используйте 'window [prop]', см. [Этот вопрос] (http://stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad- идея) знать, почему вы не должны использовать 'eval', когда вам это не нужно. – CMS

5

Eval() интерпретирует произвольные JavaScript заявления, в то время как с окном вы получаете доступ к свойству объекта окна.

В вашем примере вы, кажется, используете имя свойства как в eval(), так и в окне []. Поскольку глобальная область действия в браузере совпадает с областью объекта окна, она будет оценивать одно и то же.

Вы можете представить свой оператор eval("v"+e) как эквивалент eval("window['v'" + e +" ]").

+0

Хорошо. Но чтобы убедиться, что его ясный - это плохой способ сделать это; другой - хороший способ сделать это. – Grumdrig

+0

Да, eval почти всегда плохая идея. –

3

Оба возвращают значение глобальной переменной. Разница в том, что если глобальная переменная не определена, вы получите сообщение об ошибке при выполнении eval(), тогда как window ['variableName'] вернет undefined (а не ошибку), поскольку доступ к неопределенному свойству не является ошибкой, но доступ к неопределенной переменной является ошибкой.

+0

** умный ответ – mykhal

1

"v"+e -> Строка

eval(x) -> оценивает строку х, содержащее выражение языка

window[x] - свойство> Окна возвращается с тем же именем, как и тх значения x есть. это на самом деле может быть глобальной переменной

поэтому, когда у вас есть глобальная переменная v1 = "foo" и e = 1, затем eval("v"+e) и window["v" + e] как возвращение «Foo»

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