匿名函数的执行顺序

时间:2017-12-09 12:05:43

标签: javascript anonymous-function

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

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

f();

打印9,8。

为什么不是8,9?

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

3 个答案:

答案 0 :(得分:4)

请查看执行顺序的编号。

基本上你有4个部分,

  1. 具有提升功能的函数声明

  2. IIFE调用函数

  3. Content-Type: application/json Transfer-Encoding: chunked Content-Encoding: gzip Vary: Accept-Encoding

  4. 的新作业
  5. 新功能的最后一次调用。

  6. 
    
    f
    
    
    

答案 1 :(得分:1)

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

通过颠倒顺序:

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

你可以输出8和8作为输出,因为它会调用重写的f()函数。

答案 2 :(得分:1)

如果您需要输出,可以像这样修改

(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

有区别。行'b'是一个函数表达式。它只在到达时定义。所以当它到达'a'时我实际上并不知道'b'函数相反,c是一个函数声明,当它鼓励'f()'时,它立即知道。 在'a'执行后(执行'c'),'b'将其修改为新的定义。

为了更清楚地考虑这个功能

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

您将获得的输出是已定义的。因为直到该行a=10未执行,它才没有值。

Philip Roberts编写的这个小代码实际上显示了代码的执行方式。请查看here