繁体   English   中英

javaScript提升无法正常工作

[英]javaScript hoisting not working properly

这些是必须获得相同结果的 2 个示例:

示例 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

示例 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

JavaScript提升声明而不是初始化,请参阅此页面

如果添加“ var a;” 在第二个示例的某个地方,它应该可以正常工作!

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

a = 10为window对象设置了一个新的属性a ,并且为已经存在的对象设置属性时没有“吊起”。

当我们将执行源代码.IN 提升时,声明变量会通过console.log()。然后变量允许内存但不访问它。 当我在内存中声明一个变量时。 然后我们默认给出未定义的值来代替该变量。 (就像,在 html 中,place Holder 的工作方式是这样的。---所以你没有声明任何变量。托管在这里不起作用。---不能访问这里..因为当你定义一个变量时。然后你必须定义一个变量。在这里你不能做变量所以输出:不能访问一个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM