3

在 Javascript 中,变量被提升到声明它们的范围的顶部。
但是在下面的代码中,变量似乎myvar没有被提升。

<html>
<body>
</body>
</html>

<script type="text/javascript">
    console.log(typeof myvar);  

    var myvar = "value";    

    console.log(typeof myvar);  

</script>

上面的输出是:

undefined
string

我预计第一行会说“字符串”,因为myvar应该被提升到它上面。

为什么不是这样?

4

2 回答 2

10

变量声明被提升,分配没有。

通过var myvar 在函数中的任何位置使用,您可以创建一个局部范围的变量myvar,但是如果您跟随它,= something那么分配将以正常的代码顺序进行。

于 2015-01-04T22:03:58.510 回答
2

出现了一个骗局,昆汀的回答很好(一如既往),但只是为了更清楚地说明:

JavaScript 引擎实际处理该代码的方式是这样的:

// Before any step-by-step code
var myvar;
// Now step-by-step starts
console.log(typeof myvar);  // undefined since no value has been written to it
myvar = "value";    
console.log(typeof myvar);  // "value" because that's its value now

也就是说,这个:

var myvar = "value";

...实际上是在两个不同的时间发生的两件不同的事情。变量声明(部分),发生在范围内的var myvar任何分步代码运行之前,以及初始化myvar = "value"部分;在处理时它实际上是一个赋值表达式),发生在该行所在的位置编码。

于 2016-06-18T14:57:33.623 回答