javaScript 吊装工作不正常

javaScript hoisting not working properly

这些是必须达到相同结果的 2 个示例:

Example 1

<script>
console.log(a);
var a = 10;
console.log(a);
</script> 

已渲染

<script>
var a = "";
console.log(a); //will result undefined
a = 10;
console.log(a); //will result 10
</script> 

结果

undefined 
10

Example 2

<script>
console.log(a);
a = 10;
console.log(a);
</script> 

渲染预期

<script>
var a = "";
console.log(a); //should result undefined 
a = 10;
console.log(a); //should result 10
</script> 

结果

现在,根据 场景 2 中的 JS 提升,如果未声明的变量必须已自动声明到其作用域的顶部,并且结果应该是相同的。为什么不是呢?概念失败在哪里?

第二种情况不同,因为

a = 10

... 不声明提升变量。它在 window 对象中创建了一个 属性 (即使代码本来应该在函数内部)。这不是声明,因此 提升。因此,在您创建 属性 之前,它并不存在。

请注意,您列为 渲染代码 的内容并不完全正确。提升变量不会获得值,因此对于您的第一个示例,它应该如下所示:

var a; // undefined!
console.log(a); // will output undefined
a = 10;
console.log(a); // will output 10

请注意,如果此代码不是函数体的一部分,var a 也会 创建 window.a 属性,并且会发生这种情况在悬挂的声明中。

对于您的第二个示例,呈现的代码可能如下所示

console.log(a); // Error: does not exist. 
window.a = 10;
console.log(a); // will output 10

在示例 2 中,当您 运行 第一个控制台日志时,a 确实未定义。

a = 10 将新的 属性 a 设置为 window 对象,并且在将 属性 设置为已经存在的对象时没有 'hoisting'存在。

JavaScript 提升声明,而不是初始化,参见 this page

如果您在第二个示例中的某处添加 'var a;',它应该可以正常工作!

当我们将执行源代码.IN提升时,声明变量越过console.log()。然后变量允许内存但不访问它。当我在内存中声明一个变量时。然后我们默认给出 undefined 值来代替那个变量。 (就像,在 html 中,place Holder 是这样工作的。 --- 所以你还没有声明任何变量。托管在这里不起作用。 --- 无法访问此处..因为当您定义变量时。 那么你必须定义一个 variable.here u can not make variable so output: cannot access a