Я наткнулся на поведение переменной JavaScript, которое я не мог объяснить.Почему JavaScript объявленная переменная находится в глобальном объекте до инициализации?
В соответствии с JS docs on var keyword:
Область действия переменной, объявленной с вар функция вшита или, для переменных, объявленных вне функции, глобальный масштаб (который связан с глобальным объектом).
Кроме того, известно, что глобальные переменные становятся свойствами глобального объекта - «окно» в среде браузера и «глобальный» в node.js Это означает, что если переменная объявлена с «Var» ключевое слово внутри функция становится локальной и не попадает в глобальный объект.
Этот пример доказывает это:
(function(){
var t = 1;
console.log(t in window, t); // outputs: false 1
}());
До сих пор так хорошо. Однако, если переменная не инициализирована, она становится свойством оконного объекта, несмотря на то, что она находится в области функций.
(function(){
var t;
console.log(t in window, t); // outputs: true undefined
}());
Почему это происходит? Где я могу узнать подробности этого поведения? По-видимому, регулярные учебные пособия не охватывают это.
Заранее спасибо.
[EDIT]: Благодаря Pointy ясно, что область работает, как и ожидалось. Я просто неправильно понял поведение оператора «in». Согласно 'in' docs, он приводит в порядок левый операнд к числу или строке и ищет такой индекс или имя свойства в объекте правой руки. Таким образом, в данном примере один он был равен
'1' in window
, который был ложным
и в примере два он был
'undefined' in window
что было правдой.
Переменная все еще существует ... она просто не имеет значения. 'var a; console.log (typeof a); 'будет undefined независимо от того, где вы его положили. – Brad
Назови все мои переменные после африканских стран на день. –
Ha ha @DaveNewton на самом деле я был в замешательстве, но я признаюсь, что это стандартный диагностический тест, который я использовал в течение многих лет в ситуациях «WTF» :-) – Pointy