Порядок выполнения анонимной функции

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

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

f();

отпечатки 9, 8.

Почему это не 8, 9?

Почему первая анонимная функция не выполняется?

Теги:
anonymous-function

3 ответа

4
Лучший ответ

Пожалуйста, см. Номера для выполнения заказа.

В основном у вас есть 4 части,

  1. Объявление функции с помощью функции hoisted,

  2. IIFE, вызывающий функцию

  3. новое назначение f и

  4. последний вызов новой функции.

(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
  • 0
    Спасибо, теперь я понял :)
1

Потому что вы определили f() после его вызова.
Поэтому он не вызывает функцию f() определенную в IIFE, но выход f():

путем изменения порядка:

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

вы можете иметь 8 и 8 в качестве вывода, так как в обоих случаях он вызывает переопределенную функцию f().

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() 'encouters, он сразу же знает. Сразу после выполнения 'a' (который выполняет 'c', он будет изменен на 'b' до его нового отказа.

Чтобы сделать это более понятным, рассмотрим эту функцию

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

Результат, который вы получили, будет определен. Если до этого не будет выполняться строка a=10, она не имеет значения.

Этот небольшой код написан Филиппом Робертсом, который фактически показывает, как выполняется ваш код. Пожалуйста, смотрите здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню