Всъщност eval създава променливи или модифицира променливи в обхвата, където е дефиниран, без значение дали използвате val или не. Или с други думи, по подразбиране той няма собствен обхват.
Така че, когато правите това
eval("var outer = 0;");
console.log(outer); //0
създавате променлива във външния обхват. Изненадващо, това работи по същия начин и в chrome - и няма значение дали 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');");
Така че тази част отговаря как можете да избегнете грешка.
Втората част, която много ме интересува, но не можах да намеря отговор сам.
Въпросът е следният, защо вашият код извежда грешка в chrome, докато това работи в chrome (което означава, че глобалната променлива е създадена):
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 прави нещо странно). Така че възниква въпросът: Защо трябва да има значение дали оценката се случва в рамките на функция или в глобален обхват? Така или иначе,test
трябва да затвори надouter
... V. v. странно. - person T.J. Crowder   schedule 21.08.2014