(function() {
f();
f = function() {
console.log(8);
}
})()
function f() {
console.log(9)
}
f();
打印9,8。
为什么不是8,9?
为什么匿名函数不先执行?
答案 0 :(得分:4)
请查看执行顺序的编号。
基本上你有4个部分,
具有提升功能的函数声明
IIFE调用函数
Content-Type: application/json
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
和
新功能的最后一次调用。
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