【发布时间】:2018-09-21 07:42:10
【问题描述】:
console.log(a) //output:ƒ a(){}
var a = 1;
function a(){};
var a = 10;
console.log(a) //output:10
=====================
var a = 1;
if(true){
function a(){};
var a = 10;
}
console.log(a) // this code throws Uncaught SyntaxError: Identifier 'a' has already been declared
上面的代码 sn-ps 都是相同的,除了 if 块。为什么后者在 javascript 中允许在同一范围内使用 var 两次删除相同变量时抛出错误,如下所示
function a(){};
var a = 10; //no error
对于在上述代码中从 `var a = 10 中删除 var 后的稍微不同的场景,它工作正常但输出令人惊讶
var a = 1;
if(true) {
function a(){};
a = 10;
}
console.log(a) //output:ƒ a(){}
我很惊讶看到这个输出,因为我期待 10 ..因为在 if 块中声明的两个变量引用上面声明的相同变量,因为 javascript var 不尊重块范围但函数范围......所以为什么不输出以上应该是10? 其中,当用函数表达式替换函数定义时,下面的代码输出 10。
var a = 1;
if(true) {
var a = function(){ console.log() }
a = 10;
}
console.log(a) //output:10
【问题讨论】:
-
好吧,
if块中的函数声明在 ES5 中是无效的,因此使用它们将有 ES6 semantics 对重复声明有更严格的规则。
标签: javascript scope var hoisting