匿名函数的执行顺序

Execution order of anonymous function

(function() {
  f();
  f = function() {
    console.log(8);
  }
})()

function f() {
  console.log(9)
}

f();

打印 9、8。

为什么不是 8、9?

为什么匿名函数不先执行?

执行顺序请看数字

基本上你有4个部分,

  1. 带有提升函数的函数声明,

  2. 调用函数的 IIFE

  3. f

  4. 的新分配
  5. 最后一次调用新函数。

(function() {
  f();                 // calling hoisted function      2
  f = function() {     // assigning new function to f   3
    console.log(8);
  }
})()
function f() {         // hoisted function              1
  console.log(9)
}
f();                   // calling new function          4

因为你在调用它之后定义了f()
所以它不会调用 IIFE 中定义的 f() 函数,而是调用外部函数 f() :

颠倒顺序:

(function () {
    f = function () {
        console.log(8);
    }
    f();
})()

您可以将 8 和 8 作为输出,因为在这两种情况下它都会调用覆盖的 f() 函数。

如果你需要输出可以这样修改

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

function f() {
  console.log(9)
}

f();

但让我解释一下为什么它会这样执行。

(function() {
  f(); // Line Number -a
  f = function() { //b
    console.log(8);
  }
})()

function f() { //c
  console.log(9)
}

f() //d

有 difference.The 行 'b' 是一个函数 expression.It 仅在到达 reached.So 时定义 'a' 我没有实际上知道 'b' function.On 相反, c 是一个函数声明,当它遇到 'f()' 它立即知道。 在 'a' 执行后(执行 'c',它会被 'b' 修改为新的定义。

为了更清楚地考虑这个函数

function printMe(){
  var a;
  console.log(a);
  a = 10;//It an expression
}

你得到的输出是 defined.Because 直到那行 a=10 没有被执行,它没有值。

Philip Roberts 编写的这段小代码实际上显示了您的代码是如何执行的。请看一下here