Dea*_*ool 1 javascript scope hoisting
这些是必须达到相同结果的两个例子:
例1
<script>
console.log(a);
var a = 10;
console.log(a);
</script>
Run Code Online (Sandbox Code Playgroud)
渲染
<script>
var a = "";
console.log(a); //will result undefined
a = 10;
console.log(a); //will result 10
</script>
Run Code Online (Sandbox Code Playgroud)
结果
undefined
10
Run Code Online (Sandbox Code Playgroud)
例2
<script>
console.log(a);
a = 10;
console.log(a);
</script>
Run Code Online (Sandbox Code Playgroud)
期待渲染
<script>
var a = "";
console.log(a); //should result undefined
a = 10;
console.log(a); //should result 10
</script>
Run Code Online (Sandbox Code Playgroud)
结果
现在,根据场景2中的 JS吊装,如果未声明的变量必须已自动声明到其范围之上,但结果应该是相同的.为什么不呢?概念在哪里失败了?
第二种情况不同,因为
a = 10
Run Code Online (Sandbox Code Playgroud)
...不会声明一个悬挂变量.它在window
对象中创建一个属性(即使代码已经在函数内部).这不是一个声明,因而是一个没有悬挂的东西.因此,在创建该属性之前,它不存在.
请注意,您列为渲染代码的内容并不完全正确.提升变量没有得到值,因此对于您的第一个示例,它应该如下所示:
var a; // undefined!
console.log(a); // will output undefined
a = 10;
console.log(a); // will output 10
Run Code Online (Sandbox Code Playgroud)
请注意,如果此代码不是函数体的一部分,var a
也会创建window.a
属性,这会在提升的声明中发生.
对于您的第二个示例,渲染的代码可能如下所示
console.log(a); // Error: does not exist.
window.a = 10;
console.log(a); // will output 10
Run Code Online (Sandbox Code Playgroud)