2017-07-29 68 views
1
var a=10; 
if(a===10){ 
    console.log(a); 
    function a(){} 
    console.log(a); 
} 

因为,如果条件为真,那么console.log中的两个值为什么会在chrome v58中以函数形式出现,而在IE 8中以10形式出现?请参阅Chrome和IE8控制台输出的屏幕截图。为什么控制台输出作为一个函数?

铬:

enter image description here

IE 8:

enter image description here

+1

因为你在第4行定义了一个'''a'''作为函数。这一行等价于'''var a = function(){};''' – Wainage

+5

因为有些东西被命名吊装。 –

+0

正如上面的评论所说,尝试删除作为一个函数下面的定义,看看它是什么 –

回答

1

查找function hoisting通过@impregnable恶魔的建议。在你的代码中,即使你声明了a=10;,Javascript也会扫描所有代码,并在执行任何其他操作之前将所有已定义的函数全部取出。因此,它会找到函数function a() {},并在调用console.log之前覆盖a=10

0

您的代码就相当于这个代码:

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

首先“变种”和“功能”的进入范围的开始。阅读关于范围,特别是提升。

+1

这实际上并不正确。涉及到吊装,但是您的代码变体将函数定义提升到'var a = 10;'上方。所以你的代码将打印'10 \ n10',而OP的代码打印出'function a(){} \ nfunction a(){}'。 –

+0

@VartanChristopherSimonian好的,thx,你已经注意到我的错误:)我现在正确吗?在那种情况下。 –

+0

种类。根据ECMA-262,[块只能包含语句](https://tc39.github.io/ecma262/#sec-block),并且FunctionDeclaration不是语句。 ECMAScript 5甚至明确表示[不鼓励使用FunctionDeclarations作为语句](https://es5.github.io/x12.html#x12)。所以,从我所了解的提升行为来说,对于块中定义的函数是未定义的。节点恰好将函数提升到块的顶部。 [这是SpiderMonkey不会提升块中定义的任何功能的情况。](http://statichtml.com/2011/spidermonkey-function-hoisting.html) –

相关问题