Это тестирование, если объект window
имеет свойство (заполнено или нет), чей ключ "aa"
.
Этот оператор является очень полезным, поскольку он работает, даже если значение undefined
:
window.aa = undefined; // or just aa=undefined if you're in the global scope
console.log('aa' in window); // logs true
Он также работает, если свойство не перечислимы:
console.log('length' in []); // logs true
В вашем случае, может не должно быть значение aa
, но если предупреждение показывает вам правду, свойство было добавлено к window
.
MDN reference on in
Обратите внимание, что for...in
заявление отличается тем, что он на самом деле не использовать оператор in
, но конкретная конструкция.
MDN reference on for...in
EDIT: объяснение отредактированном вопроса (очень отличается от первого):
Ваше замешательство, кажется, возникает из того факта, вы объявившего var aa = 1;
в Блок. Вы должны знать, что область видимости переменной в JavaScript является либо функцией глобальной области видимости, и что объявления поднимаются. Так что ваш код фактически эквивалентно
var aa = undefined;
if (!("aa" in window)) { // aa is in window, so we don't enter here
alert('oh my god');
aa = 1;
}
alert("aa" in window); // yes, the property exists, it's true
alert(aa); // aa is still undefined
Я полагаю, что переменная с именем 'aa' была создана в глобальном контексте. 'alert (« aa »в окне);' возвращает false для меня, но 'aa =" foo "; alert («aa» в окне); 'возвращает true. – andyb
О, мой бог, я думаю, что потерял код, когда у меня возник вопрос ... – LIXer
Я думаю, что теперь это совершенно другой вопрос, если вы спрашиваете о предупреждениях. Я бы рекомендовал изменить заголовок вопроса для лучшего описания вашей проблемы. – andyb