匿名函数的执行顺序
Execution order of anonymous function
(function() {
f();
f = function() {
console.log(8);
}
})()
function f() {
console.log(9)
}
f();
打印 9、8。
为什么不是 8、9?
为什么匿名函数不先执行?
执行顺序请看数字
基本上你有4个部分,
带有提升函数的函数声明,
调用函数的 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()
。
所以它不会调用 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
(function() {
f();
f = function() {
console.log(8);
}
})()
function f() {
console.log(9)
}
f();
打印 9、8。
为什么不是 8、9?
为什么匿名函数不先执行?
执行顺序请看数字
基本上你有4个部分,
带有提升函数的函数声明,
调用函数的 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()
。
所以它不会调用 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