2013-08-02 2 views
1

У меня есть следующие две небольшие скрипты:Переменная Scope Поведение в JSFiddle

Сценарий 1:

eval("local = 3;"); 
console.log(typeof local); 
Function("console.log(typeof local);")(); 

Выход:

number 
number 

Сценарий 2:

eval("var local = 3;"); 
console.log(typeof local); 
Function("console.log(typeof local);")(); 

Выходные :

number 
undefined 

Что дает? Должен ли eval локализовать в глобальном пространстве имен независимо от того, имеет ли строка строка var local = 3 или local = 3? Если это так, не должно Function(...) найти, что тип локального номера во втором случае не является неопределенным?

EDIT 1:

Я побежал оба сценария в JSFiddle и те были результаты, которые я получил. Тем не менее, когда я запускаю их вне JSFiddle, ожидаемые результаты происходят тогда, когда оба выхода является:

number 
number 
+3

Вы не выполняете Script 2 в глобальной области, поэтому 'eval' создает локальную переменную. – bfavaretto

+0

Это в глобальном масштабе. Но это было в JSFiddle, а не прямо из браузера. – moesef

+0

См. Мой комментарий ниже, jsfiddle по умолчанию использует локальную область обработчика window.onload. – bfavaretto

ответ

2

MDN От:

функции, созданная с помощью конструктора Function не создают замыкания в их контекст создания; они всегда запускаются в контексте окна (если тело функции не начинается с оператора «use strict»; в этом случае контекст не определен).

С точки зрения спецификации, это происходит потому, что на стадии 11 из 15.3.2.1 (курсив мой):

Возвращает новый объект Function создан, как указано в 13.2, проходящей P как FormalParameterListopt и тело как FunctionBody. Перейдите в глобальную среду как параметр области и строго соблюдайте строгий флаг.

Таким образом, ваш скрипт 2 создает переменную в локальной области видимости (which I'm assuming is not global, или выход будет отличаться) и console.log Эвальд по Function не может видеть его.


Как подтвердить ваши комментарии, вы запускали тесты в jsfiddle, который по умолчанию Обертывания код в обработчике window.onload, заставляя вас из глобального масштаба.

+0

Я был в глобальном масштабе, но я использовал JSFiddle. Кажется, что в JSFiddle случается странно, а не за скриптом прямо через браузер. – moesef

+1

JSFiddle по умолчанию для обработчика window.onload с кодом внутри. См. Скрипт, который я только что связал, который имеет правильные настройки: http://jsfiddle.net/8kG5U/ – bfavaretto

+0

Ох ... не заметил этого. Благодарю. – moesef

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