2013-05-02 2 views
4

Я наткнулся на поведение переменной JavaScript, которое я не мог объяснить.Почему JavaScript объявленная переменная находится в глобальном объекте до инициализации?

В соответствии с JS docs on var keyword:

Область действия переменной, объявленной с вар функция вшита или, для переменных, объявленных вне функции, глобальный масштаб (который связан с глобальным объектом).

Кроме того, известно, что глобальные переменные становятся свойствами глобального объекта - «окно» в среде браузера и «глобальный» в node.js Это означает, что если переменная объявлена ​​с «Var» ключевое слово внутри функция становится локальной и не попадает в глобальный объект.

Этот пример доказывает это:

(function(){ 
    var t = 1; 
    console.log(t in window, t); // outputs: false 1 
}()); 

jsfiddle link

До сих пор так хорошо. Однако, если переменная не инициализирована, она становится свойством оконного объекта, несмотря на то, что она находится в области функций.

(function(){ 
    var t; 
    console.log(t in window, t); // outputs: true undefined 
}()); 

jsfiddle link

Почему это происходит? Где я могу узнать подробности этого поведения? По-видимому, регулярные учебные пособия не охватывают это.

Заранее спасибо.

[EDIT]: Благодаря Pointy ясно, что область работает, как и ожидалось. Я просто неправильно понял поведение оператора «in». Согласно 'in' docs, он приводит в порядок левый операнд к числу или строке и ищет такой индекс или имя свойства в объекте правой руки. Таким образом, в данном примере один он был равен

'1' in window 

, который был ложным

и в примере два он был

'undefined' in window 

что было правдой.

+0

Переменная все еще существует ... она просто не имеет значения. 'var a; console.log (typeof a); 'будет undefined независимо от того, где вы его положили. – Brad

+0

Назови все мои переменные после африканских стран на день. –

+0

Ha ha @DaveNewton на самом деле я был в замешательстве, но я признаюсь, что это стандартный диагностический тест, который я использовал в течение многих лет в ситуациях «WTF» :-) – Pointy

ответ

4

Проблема в том, что ваш тестовый код ошибочно использует оператор in. То, что на самом деле тестирует, заключается в том, определено ли имя «неопределенный» в window, а не «t». Зачем? Поскольку левый операнд in принуждается к строке. Поскольку «t» равен undefined, он принуждается к строке «undefined», и действительно, это имя свойства присутствует в глобальном контексте.

Изменить тест на

console.log("t" in window, t); 
+0

Ваше предложение кажется действительным. Большое спасибо. Я был полностью озадачен и думал, что что-то не так с прицелом, но причиной было неправильное понимание оператора «in». –

2

доступа к переменной, объявленной

var t; 

дает:

console.log(t); 
undefined 

console.log(undefined === t) 
true 

неопределенными является свойством окна

console.log(undefined in window); 
+0

Спасибо за помощь. –

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