(function() {
f();
f = function() {
console.log(8);
}
})()
function f() {
console.log(9)
}
f();
отпечатки 9, 8.
Почему это не 8, 9?
Почему первая анонимная функция не выполняется?
Пожалуйста, см. Номера для выполнения заказа.
В основном у вас есть 4 части,
Объявление функции с помощью функции hoisted,
IIFE, вызывающий функцию
новое назначение f
и
последний вызов новой функции.
(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()
после его вызова.
Поэтому он не вызывает функцию f()
определенную в IIFE, но выход 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
Существует различие. Строка 'b'
является выражением функции. Она определяется только тогда, когда она достигнута. Поэтому, когда она достигает 'a'
я фактически не знает о функции "b". Напротив, c
является объявление функции, и когда это f() 'encouters, он сразу же знает. Сразу после выполнения 'a'
(который выполняет 'c'
, он будет изменен на 'b'
до его нового отказа.
Чтобы сделать это более понятным, рассмотрим эту функцию
function printMe(){
var a;
console.log(a);
a = 10;//It an expression
}
Результат, который вы получили, будет определен. Если до этого не будет выполняться строка a=10
, она не имеет значения.
Этот небольшой код написан Филиппом Робертсом, который фактически показывает, как выполняется ваш код. Пожалуйста, смотрите здесь