【问题标题】:Variable not hoisted变量未提升
【发布时间】:2015-01-04 22:02:30
【问题描述】:

在 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 提升到它的上方。

为什么不是这样?

【问题讨论】:

    标签: javascript hoisting


    【解决方案1】:

    变量声明被提升,赋值没有。

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

    【讨论】:

    • 我认为“typeof variable”是检查变量是否被声明的方法。那么如何才能有一些打印证明 myvar 确实被提升了呢?
    • typeof 会告诉你变量的 value 是什么类型。为了演示提升,在更大范围内定义另一个具有相同名称和不同值的变量,然后测试以查看值是否不同。
    • @kroiz——除了全局变量之外,没有办法判断一个标识符是否是一个声明的变量,因为它们是全局对象的属性。
    【解决方案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-07-31
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多