【问题标题】:Does Javascript hoisting only consider the first var in a scope?Javascript 提升是否只考虑范围内的第一个 var?
【发布时间】:2015-06-26 18:23:01
【问题描述】:

在以下 JavaScript 代码中,saySomething() 写入“Hello there!”但不是“你好!”。这是否表明提升仅适用于范围内的第一个 var?

var whatToSay = 'Hello World!';

function saySomething() {
  if (!whatToSay) {
    var whatToSay = 'Hello there!';
  }  
  document.write(whatToSay);
  var whatToSay = 'Hello you!';
}

saySomething();

这里是JS Bin http://jsbin.com/fiyimefeso/1/edit?js,output的链接

【问题讨论】:

  • 这可能会帮助你理解:stackoverflow.com/questions/7506844/…
  • @NormanBreau 谢谢你,但该链接无法帮助我了解为什么 var whatToSay = 'Hello there!' 优先于 var whatToSay = 'Hello you!'
  • 提升只创建一个变量,不做赋值。
  • JavaScript 只提升声明,而不是初始化。
  • 它没有“优先”,只是碰巧在 write 之前的变量值是“Hello there”。正如dansasu所说,它的价值与声明无关。它不会神奇地抓取最后一个赋值并将其用于整个函数,而只是“Hello there”是使用前最后一个保持的值

标签: javascript hoisting


【解决方案1】:

不。提升意味着 var declarations 发生在代码执行之前。 Var assignments 发生在代码执行期间。提升时,所有变量都有undefined 值。

在这里证明:http://jsbin.com/xezamexama/edit?js,output

将类型检查添加到比较中,它将按您的预期打印undefined 而不是"Hello you!"

【讨论】:

  • 谢谢,我没有考虑过单独分配吊装过程。您的回答很好地解释了正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 2018-12-22
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2022-10-15
相关资源
最近更新 更多