Javascript 为什么控制台输出作为一个函数出现?

Javascript 为什么控制台输出作为一个函数出现?,javascript,Javascript,既然,若条件为真,那个么为什么console.log的值在ChromeV58中都是函数,在IE8中都是10?请参考Chrome和IE8控制台输出的屏幕截图 铬: IE 8: 按照@firgnable fidend的建议查找功能提升。在代码中,即使声明a=10Javascript将扫描所有代码,并在执行任何其他操作之前提取它找到的所有已定义函数。因此,它将查找函数函数a(){},并在调用控制台之前覆盖a=10。log。您的代码与此代码等效: var a=10; if(a===10){ con

既然,若条件为真,那个么为什么console.log的值在ChromeV58中都是函数,在IE8中都是10?请参考Chrome和IE8控制台输出的屏幕截图

铬:

IE 8:


按照@firgnable fidend的建议查找
功能提升
。在代码中,即使声明
a=10Javascript将扫描所有代码,并在执行任何其他操作之前提取它找到的所有已定义函数。因此,它将查找函数
函数a(){}
,并在调用
控制台之前覆盖
a=10
。log

您的代码与此代码等效:

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

首先,“var”和“function”进入作用域的开头。阅读范围,尤其是提升。

因为您在第4行将
a
定义为一个函数。该行相当于
var a=function(){}因为有一个东西叫做提升。正如上面的评论所说的,试着删除下面的函数定义,看看它做了什么。这个可能的副本实际上是不正确的。涉及提升,但您的代码变体将函数定义提升到上述
var a=10。因此,您的代码将打印
10\n10
,而OP的代码打印
函数a(){}\n函数a(){}
@vartanchristorsimonian好的,谢谢您注意到我的错误:)我现在正确了吗?在那种情况下。根据ECMA-262,函数声明不是语句。ECMAScript 5甚至明确表示了这一点。因此,根据我的理解,在块中定义的函数的提升行为是未定义的。节点恰好将函数提升到块的顶部。
var a = 10;
if (a===10) {
  var a = function() {};
  console.log(a);
  console.log(a);
}