【问题标题】:Value after hoisting? [closed]吊装后的价值? [关闭]
【发布时间】:2013-04-05 17:35:54
【问题描述】:

问题:bar吊起来后的价值是多少?

var bar = function() {
return 3;
};

我认为:函数表达式。我错了吗?

【问题讨论】:

  • 我不太确定您期望的答案是什么...每个变量最初都有值undefined,直到执行分配的行。在这种情况下,bar 被分配了一个函数。你认为吊装是什么?

标签: javascript function expression hoisting


【解决方案1】:

为什么不试试呢?

var bar = function() {
    return 3;
 };

console.log(bar);

输出,

  function () {
    return 3;
  }

【讨论】:

  • 谢谢,但是:在这种情况下,提升与不提升有什么区别?如何模拟吊装?
  • 我想你可能只提供了部分相关代码。提升在这里并不真正相关,我猜你的例子叫做 bar 在更远的地方?
  • console.log(bar); // 未定义 var bar = function() { return 3; };
  • 我不明白你在问什么。提升将使代码中定义的“bar”高于实际分配 var bar 的位置;请参阅 adequatelygood.com/JavaScript-Scoping-and-Hoisting.html 以获取有关该主题的优秀教程。
【解决方案2】:

确实是功能。所以是的,你是对的。

【讨论】:

    【解决方案3】:

    如果您尝试使用未定义的变量,那当然会引发引用错误。如果您尝试分配给未定义的变量,那么它将创建一个全局变量(在网页中,大致相当于写window.foo = bar;)。但是,该变量在创建之前仍然是未定义的。

    但是,如果您使用constvar 声明局部变量,那么它将从函数的开头定义为具有值undefined,因此“早期”访问变量不会引发引用错误,设置它将设置本地值。您不必在函数开始时声明变量;声明将被提升到函数的范围内。

    相比之下,在ES6中,如果你使用let声明一个变量,那么它只会被提升到块的开头。

    另外,如果你使用function 声明一个“变量”,那么它的值也会被提升,所以你可以在它声明之前调用一个函数。 (该函数必须在同一个脚本中。)

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      相关资源
      最近更新 更多