var a=10;
if(a===10){
console.log(a);
function a(){}
console.log(a);
}
因为,如果条件为真,那么console.log中的两个值为什么会在chrome v58中以函数形式出现,而在IE 8中以10形式出现?请参阅Chrome和IE8控制台输出的屏幕截图。为什么控制台输出作为一个函数?
铬:
IE 8:
var a=10;
if(a===10){
console.log(a);
function a(){}
console.log(a);
}
因为,如果条件为真,那么console.log中的两个值为什么会在chrome v58中以函数形式出现,而在IE 8中以10形式出现?请参阅Chrome和IE8控制台输出的屏幕截图。为什么控制台输出作为一个函数?
铬:
IE 8:
查找function hoisting
通过@impregnable恶魔的建议。在你的代码中,即使你声明了a=10;
,Javascript也会扫描所有代码,并在执行任何其他操作之前将所有已定义的函数全部取出。因此,它会找到函数function a() {}
,并在调用console.log
之前覆盖a=10
。
您的代码就相当于这个代码:
var a = 10;
if (a===10) {
var a = function() {};
console.log(a);
console.log(a);
}
首先“变种”和“功能”的进入范围的开始。阅读关于范围,特别是提升。
这实际上并不正确。涉及到吊装,但是您的代码变体将函数定义提升到'var a = 10;'上方。所以你的代码将打印'10 \ n10',而OP的代码打印出'function a(){} \ nfunction a(){}'。 –
@VartanChristopherSimonian好的,thx,你已经注意到我的错误:)我现在正确吗?在那种情况下。 –
种类。根据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) –
因为你在第4行定义了一个'''a'''作为函数。这一行等价于'''var a = function(){};''' – Wainage
因为有些东西被命名吊装。 –
正如上面的评论所说,尝试删除作为一个函数下面的定义,看看它是什么 –