javaScript提升无法正常工作

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吊装,如果未声明的变量必须已自动声明到其范围之上,但结果应该是相同的.为什么不呢?概念在哪里失败了?

tri*_*cot 6

第二种情况不同,因为

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)