var a;
if (true) {
a = 5;
function a() {}
a = 0;
console.log(a)
}
console.log(a)
我看到上面的代码,在{}中声明了一个函数。我认为它会打印 0 0,但它会打印 0 5
最佳答案
会发生以下情况:
(1) 存在两个变量声明a
,一个在 block 内,一个在 block 外。
(2) 函数声明被提升,并绑定(bind)到内部 block 变量。
(3) a = 5
到达,它会覆盖 block 变量。
(4) 到达函数声明,将 block 变量复制到外部变量。现在两人都5岁了。
(5) a = 0
到达,它会覆盖 block 变量。外部变量不受此影响。
var a¹;
if (true) {
function a²() {} // hoisted
a² = 5;
a¹ = a²; // at the location of the declaration, the variable leaves the block
a² = 0;
console.log(a²)
}
console.log(a¹);
这实际上并不是规范的一部分,它是 web legacy compatibility semantics 的一部分。 ,所以不要依赖此代码以这种方式运行,并且始终 "use strict";
mode .这也解释了here .
关于javascript - block 中的函数声明将临时值移出 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58619924/