【问题标题】:unexpected results with function and variable hoisting [duplicate]函数和变量提升的意外结果[重复]
【发布时间】:2018-11-05 12:11:42
【问题描述】:

我正在阅读“你不懂 JS”系列的第二本书,我已经在变量之前提升了 read that 函数。

所以这是代码:

foo(); // 1

var foo;

function foo() {
    console.log( 1 );
}

foo = function() {
    console.log( 2 );
};

这个输出将是 1。但是为什么呢?首先提升函数,然后提升变量。所以在我的函数 foo(打印 1 的那个)被提升之后,它必须跟着变量 foo。所以结果应该是“未定义”而不是“1”。

我希望代码表现得像以前一样:

// hoisted first
function foo() {
    console.log( 1 );
}

// hoisted second
var foo;  // implicitly initialized to 'undefined'

foo();  // call 'undefined' - error?

foo = function() {
    console.log( 2 );
};

这里发生了什么?

【问题讨论】:

  • 哦,微妙。我喜欢这个问题。

标签: javascript hoisting


【解决方案1】:

如前所述,函数在变量之前被提升;如果解释器遇到var foo 之后 foo 已经在范围内定义,它将被简单地忽略。它不会将foo 分配给undefined,它只确保一个名为foo 的变量存在于当前作用域中——它已经这样做了。

正如你不知道的 JS 链接中所说:

多个/重复的 var 声明被有效地忽略

这是另一个常见的被忽略的重复变量的常见示例,可能更熟悉/直观:

if (false)
  var foo = false;
else
  var foo = true;

变成

var foo;
var foo; // does not actually do anything; does not assign `undefined` to `foo`, ignored
// foo just *happens* to not have anything assigned to it in almost all cases like this
if (false)
  foo = false;
else
  foo = true;

【讨论】:

  • 但是即使我将变量设置为函数表达式,我也会再次得到结果 1。
  • @BoSsYyY 您已经在原始代码中将变量设置为函数表达式。什么意思?
  • @BoSsYyY,assignment 没有被提升:它发生在你调用函数之后。
  • 是的,我知道该作业不是托管的。但是看看这个例子: foo(); // 1 var foo = function() { console.log("2"); };函数 foo() { console.log( 1 );这里变量“foo”将被提升然后函数表达式应该被分配给它(但它不是)然后被执行。但是结果还是1
  • @BoSsYyY 函数声明被提升;函数表达式(=)不是。那个 is 赋值,所以在赋值之前调用foo 会得到1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多