2013-05-30 3 views
2

Я нашел этот код:Что означает ключевое слово 'in' в javascript?

if (!("aa" in window)) { 
    alert('oh my god'); 
    var aa = 1; 
} 
alert("aa" in window); 
alert(aa); 

Этот код второе предупреждение является предупреждение true, но, третье предупреждение «не определено», и предупреждение в «если» не запускается. Зачем?

Я думаю, что причина такова: in; каков его эффект?

Я искал в Google, но ничего не нашел, поскольку Google считает, что слово ‘ в &srquo; - это слово фильтра.

Мы всегда используем in в цикле, но, честно говоря, я использую его, но дон ’ t действительно его понимает.

+1

Я полагаю, что переменная с именем 'aa' была создана в глобальном контексте. 'alert (« aa »в окне);' возвращает false для меня, но 'aa =" foo "; alert («aa» в окне); 'возвращает true. – andyb

+0

О, мой бог, я думаю, что потерял код, когда у меня возник вопрос ... – LIXer

+0

Я думаю, что теперь это совершенно другой вопрос, если вы спрашиваете о предупреждениях. Я бы рекомендовал изменить заголовок вопроса для лучшего описания вашей проблемы. – andyb

ответ

7

Это тестирование, если объект 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 
+0

спасибо, и я сожалею о описании моего вопроса – LIXer

+0

Добро пожаловать. Но вы должны удалить часть EDIT вашего вопроса: вопросы не должны включать ответ на SO. Давайте сделаем это чистым для других будущих пользователей. –

1

Принимая предупреждения в порядке:

  • оповещения # 1 никогда не достигается, потому что ("aa" in window) === true поэтому if логическое условие ложно.

JavaScript имеет function scope и переменная aa является "hoisted" до верхней части рамки первого, так что это определен.

  • оповещения # 2

"aa" in window верно, так как переменная была добавлена ​​в объект окна, когда он был поднят вверх. Эквивалент просто писать:

var foo; 
"foo" in window (which === true) 
  • предупреждение # 3

Из Standard ECMA-262 ECMAScript Language Specification:

переменная оператор объявляет переменные, которые создаются, как определено в 10.5. Переменные инициализируются до undefined при создании. Переменной с инициализатором присваивается значение его AssignmentExpression, когда выполняется переменнаяStatement, а не при создании переменной.

Так что aa не определено, поскольку назначение не было выполнено.

+1

спасибо, я знаю область действия, но я не рассматриваю функцию в своем коде, о нет, мой javascript настолько слаб. – LIXer

+0

Рад помочь! Это был интересный вопрос. Поскольку в JavaScript нет области блока (область блока, определенная как внутри '{...}'), переменная будет доступна вне блока 'if'. – andyb

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