Javascript自执行功能是否像编译程序一样工作。即,您可以在自执行函数中的命名匿名函数之后声明一些函数,并让命名的匿名函数在运行时找到另一个函数吗? I.e为什么以下工作?
我认为你不能提升命名的匿名函数,因为它们只是在运行时创建的,所以也许自执行函数“编译”代码,使命名的匿名函数可用于调用它的函数!
(function(){
var myFunc = function(){
var bar = "Bar";
return myFunc2() + bar;
}
function myFunc2(){
return "Foo ";
}
})()
甚至
(function(){
function myFunc(){
var bar = "Bar";
return myFunc2() + bar;
}
var myFunc2 = function(){
return "Foo ";
}
window.fooBar = myFunc();
})()
console.log(fooBar);
答案 0 :(得分:2)
该特定示例有效,因为永远不会调用myFunc2
,因为永远不会调用myFunc
。
一般来说,JS范围,提升和时间的正常规则适用:
必须在使用之前填充变量,而不是在定义将在调用时使用它的函数之前填充。
答案 1 :(得分:0)
(function(){
var myFunc = function(){
var bar = "Bar";
return myFunc2() + bar;
}
function myFunc2(){
return "Foo ";
}
})()
经过一些提升后,这就成了:
(function(){
var myFunc;
function myFunc2(){
return myFunc2() + bar;
}
myFunc = function(){
var bar = "Bar";
return "Foo ";
}
})()
实际上,如果你调用myFunc(),这将有效;并记录myFunc2返回的值,你会得到Foo Bar。
仅在提升命名的匿名函数(实际上是函数表达式)时 var myFunc(= undefined);被悬挂。然后作业保持在同一水平。
此外,您无法将此函数称为自执行函数(因为自执行函数实际上是递归)。这是立即调用的函数表达式。
并且@Quentin说剩下的:在使用它之前必须填充一个变量,而不是在定义一个在调用时使用它的函数之前。
答案 2 :(得分:0)
让我们看看代码中究竟发生了什么。
1.你有一个执行变量赋值的函数: var myFunc =;
2.你宣布一个功能。 (但还没有调用它)
3.将myFunc分配给window.foobar。
4.然后你调用你定义的函数。
现在,这些步骤发生了:
myFunc获取一个函数作为其值。
myFunc2已定义。
window.foobar获取调用myFunc()的结果。 所以会发生什么,myFunc()返回调用myFunc2()的结果并将其结果附加到bar。
因此,window.foobar的值将是“foobar”。
(不,这不是编译程序的工作原理)