Вы когда-нибудь видели это странное поведение / ошибку IE JavaScript? - PullRequest
6 голосов
/ 05 июля 2011

ОК, это сводит меня с ума:

Первый пример, без проблем:

<script>

window.myvar = 150;

if (false) {
  var myvar = 3;
}

// This will popup "150"
alert(myvar)

</script>

Теперь, с ДВУМЯ элементами скрипта:

<script>

window.myvar = 150;

</script>

<script>

if (false) {
  var myvar = 3;
}

// This will popup "undefined"
alert(myvar)

</script>

Протестировано с IE8.

Вы хоть представляете, почему?

Ответы [ 5 ]

3 голосов
/ 05 июля 2011

Это потому, что, поскольку javascript выполняет область видимости на основе уровней функций, ваш код вычисляет / компилирует / эквивалентно следующему:

<script>

window.myvar = 150;

</script>

<script>
var myvar;

if (false) {
  myvar = 3;
}

// This will popup "undefined"
alert(myvar)

</script>
3 голосов
/ 05 июля 2011

Во втором примере, во втором блоке script, myvar был поднят (согласно спецификации) к вершине вмещающей области. Помните, JavaScript не имеет области видимости блока, только область действия функции.

Следовательно, var myvar (расшифрованное определение, которое интерпретируется) приведет к myvar, равному undefined, когда alert() ищет myvar в VariableObject .

2 голосов
/ 06 июля 2011

Это немного больше, чем сказал Алекс (хотя он только что сослался на мою статью - спасибо!).

Если бы кодовая последовательность была в той последовательности, которая появляется, "var myVar" не была бы поднята(или, скорее, его подъем не будет иметь никакого эффекта), потому что сначала определяется "window.myvar = 150" (более того, это не объясняет, почему первый пример работал, а второй только в IE не удался)

Это выглядиткак второй скрипт (как-то) загружается до первого - но только в IE8.Вы можете смоделировать переключение последовательности тегов, и вы увидите неопределенное предупреждение во всех браузерах

var myvar;

if (false) {
  myvar = 3;
}

alert(myvar)

window.myvar = 150;
0 голосов
/ 05 июля 2011

Я за подъем, как сказал Алекс.Компилятор видит, что вы определяете myvar в своем блоке (var myvar внутри if), и поднимает ранее известный myvar.Я не уверен, что это ошибка или особенность.

0 голосов
/ 05 июля 2011

Это не происходит со мной в iOS Safari на 4.3.1, поэтому это может быть ошибка в IE.Тем не менее, ответ @ alex также может быть правдой.Ad @ м

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...