变量未提升
Variable not hoisted
在 Javascript 中,变量被提升到它们声明的范围的顶部。
但是在下面的代码中,变量 myvar
似乎没有被提升。
<html>
<body>
</body>
</html>
<script type="text/javascript">
console.log(typeof myvar);
var myvar = "value";
console.log(typeof myvar);
</script>
上面的输出是:
undefined
string
我预计第一行会说 "string" 因为 myvar
应该被提升到它上面。
为什么不是这样?
变量声明被提升,赋值没有。
通过在函数中的任何位置使用 var myvar
,您可以创建一个局部范围的变量 myvar
,但是如果您在它后面加上 = something
,那么分配将按正常代码顺序进行。
出现了一个骗局,昆汀的回答很好(一如既往),但只是为了更清楚地说明:
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
部分),发生在作用域中任何逐步代码之前的是运行, initialization(myvar = "value"
部分;它在处理时实际上是一个赋值表达式),它发生在代码中该行的位置。
在 Javascript 中,变量被提升到它们声明的范围的顶部。
但是在下面的代码中,变量 myvar
似乎没有被提升。
<html>
<body>
</body>
</html>
<script type="text/javascript">
console.log(typeof myvar);
var myvar = "value";
console.log(typeof myvar);
</script>
上面的输出是:
undefined
string
我预计第一行会说 "string" 因为 myvar
应该被提升到它上面。
为什么不是这样?
变量声明被提升,赋值没有。
通过在函数中的任何位置使用 var myvar
,您可以创建一个局部范围的变量 myvar
,但是如果您在它后面加上 = something
,那么分配将按正常代码顺序进行。
出现了一个骗局,昆汀的回答很好(一如既往),但只是为了更清楚地说明:
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
部分),发生在作用域中任何逐步代码之前的是运行, initialization(myvar = "value"
部分;它在处理时实际上是一个赋值表达式),它发生在代码中该行的位置。