На самом деле eval создает переменные или изменяет переменные в области видимости, где она определена, независимо от того, используете ли вы val или нет. Или, другими словами, по умолчанию у него нет собственной области видимости.
Итак, когда вы делаете это
eval("var outer = 0;");
console.log(outer); //0
вы создаете переменную во внешней области. Удивительно, но это работает так же и в хроме - и не имеет значения, используется ли window.onload или нет.
Чтобы сделать eval собственной областью действия, вы должны сделать следующее:
eval("'use strict'; var outer = 0;");
console.log(outer); //Uncaught ReferenceError: outer is not defined
Теперь для eval есть отдельная область видимости. С 'use strict' в eval ваш код будет работать в chrome и не позволит переопределять переменные вне eval.
eval("'use strict'; var outer = 0; function test() {'use strict'; outer = 1; } test(); alert('ok');");
Итак, эта часть отвечает, как вы можете избежать ошибок.
Вторая часть, которая меня очень заинтересовала, но я не смог найти ответ сам.
Возникает вопрос, почему ваш код выдает ошибку в хроме, в то время как это работает в хроме (что означает, что создается глобальная переменная):
window.onload = function() {
eval("var outer = 0; function test(){console.log(outer); } test();");
}
А также почему это происходит только с window.onload
.
person
Elena
schedule
21.08.2014
window.onload
. (Второй раскрывающийся список слева.) Если вы отключите это, код (в глобальном масштабе) будет работать так, как ожидалось: jsfiddle.net/rokkkjcs/2 Я также проверил это без использования jsFiddle (на случай, если jsFiddle делает что-то странное). Таким образом, возникает вопрос: почему должно иметь значение, происходит ли eval внутри функции или в глобальной области видимости? В любом случае,test
должен закрыться черезouter
... В. о. странно. - person T.J. Crowder   schedule 21.08.2014