var a=10;
if(a===10){
  console.log(a);
  function a (){}
  console.log(a);
}

Поскольку, если условие истинно, то почему значение обоих console.log поступает как функция в chrome v58 и как 10 в IE 8? См. Снимок экрана с выходными данными консоли Chrome и IE8.

Хром:

enter image description here

IE 8:

enter image description here

1
Shivam 29 Июл 2017 в 21:46
1
Поскольку вы определяете a как функцию в строке 4. Эта строка эквивалентна var a = function() {};
 – 
Wainage
29 Июл 2017 в 21:48
5
Потому что есть кое-что, что называется подъемом.
 – 
impregnable fiend
29 Июл 2017 в 21:48
Как сказано в приведенном выше комментарии, попробуйте удалить определение a как функции ниже и посмотрите, что он делает.
 – 
Jason Krs
29 Июл 2017 в 21:50
 – 
user7050402
29 Июл 2017 в 21:51
1
 – 
JJJ
29 Июл 2017 в 21:52

2 ответа

Найдите function hoisting, как подсказал @impregnable fiend. В вашем коде, даже если вы объявляете a=10;, Javascript будет сканировать весь код и извлекать все определенные функции, которые он находит, прежде чем делать что-либо еще. Таким образом, он найдет функцию function a() {} и перезапишет a=10 перед вызовом console.log.

1
Jarek Kulikowski 29 Июл 2017 в 21:52

Ваш код эквивалентен этому коду:

var a = 10;
if (a===10) {
  var a = function() {};
  console.log(a);
  console.log(a);
}

Прежде всего, «var» и «function» идут в начало области видимости. Прочтите о прицелах и, в частности, о подъеме.

0
impregnable fiend 29 Июл 2017 в 22:48
1
На самом деле это не так. Подъем задействован, но ваш вариант кода поднимает определение функции выше var a = 10;. Таким образом, ваш код будет печатать 10\n10, тогда как код OP печатает function a(){}\nfunction a(){}.
 – 
Adaline Simonian
29 Июл 2017 в 21:55
Хорошо, спасибо, что вы заметили мою ошибку :) Теперь я прав? В этом случае.
 – 
impregnable fiend
29 Июл 2017 в 22:50
Вид. Согласно ECMA-262, Блоки могут содержать только утверждения, а объявление функции не является Заявление. В ECMAScript 5 даже прямо сказано, что использование FunctionDeclarations в качестве операторов не рекомендуется. Таким образом, поведение подъема, насколько я понимаю, для функции, определенной в блоке, не определено. Узел просто поднимает функцию на вершину блока. Вот случай, когда SpiderMonkey не будет поднимать никакие функции, определенные в блоке.
 – 
Adaline Simonian
29 Июл 2017 в 23:05