【问题标题】:javascript hoisting: what would be hoisted first — variable or function?javascript 提升:首先提升什么——变量还是函数?
【发布时间】:2018-04-18 12:36:57
【问题描述】:

最近我对 javascript 提升行为感到困惑,现在我陷入了困境。

所以,有两个例子。

var alpha = 'alpha';

var beta = 'beta';

f(); //beta


var f = function f1() {
    console.log(beta);
};

function f() {
    console.log(alpha);
}

f(); // alpha

第一个按预期工作,因为当 Javascript 设置词法环境时,函数声明覆盖了我们的变量 f(值为“未定义”)。

但第二个给了我一个推动,我不明白的东西。

var alpha = 'alpha';

var beta = 'beta';

f();  // - alpha


function f() {
    console.log(alpha);
}

var f = function f1() {
    console.log(beta);
};


f(); // beta

为什么变量f没有被提升到代码的顶部,并且覆盖了我们之前提升的函数? 为什么在 “first f” 调用中我收到“alpha”。我认为,这一定是一个错误,例如: “f 不是函数”,因为在 first f 调用中,我预计 f 将是 "undefined"

【问题讨论】:

  • 技术上,两个sn-ps是一样的
  • 您可能会发现this answer 很有用。
  • 感谢所有回答。也许这个陈述可以帮助像我这样不理解这个东西的人:所以这涵盖了变量提升,但是函数提升呢?尽管两者都被称为“提升”,但行为实际上是完全不同的。与变量不同,函数声明不只是提升函数的名称。 它还提升了实际的函数定义。

标签: javascript function variables hoisting


【解决方案1】:

给定var foo = something,只有变量声明被提升。

这意味着var foo 被提升,但foo = something 将按阅读顺序运行。

给定function foo() {},变量声明函数赋值都被提升了。这将创建变量 foo 并为其赋予函数的值。

如果您同时具备上述两种情况,那么您将变量声明两次(为了没有额外的效果)并将函数的值分配给它(因为这是唯一的分配)。

所以在你的第二个例子中......

函数声明被提升,所以f(); // - first f 调用它。

函数表达式的赋值没有被提升,但f(); // ** - second f 以正常的阅读顺序出现在它之后,所以第二次调用foo() 会命中。

【讨论】:

    【解决方案2】:

    从技术上讲,这两个 sn-ps 是相同的

    类似

    function f() {
        console.log(alpha);
    }
    var alpha = 'alpha';
    var beta = 'beta';
    var f; // ignored because f is already defined
    f();  // - first f
    f = function f1() {
        console.log(beta);
    };
    f(); // ** - second f
    

    或者也许 - 不过,我很确定 function 首先被“提升”

    var alpha = 'alpha';
    var beta = 'beta';
    var f;
    function f() {
        console.log(alpha);
    }
    f();  // - first f
    f = function f1() {
        console.log(beta);
    };
    f(); // ** - second f
    

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多