Javascript 请解释这两者之间的区别;立即调用的函数表达式;及;自调用匿名函数“;
受这个问题的启发,若昂·席尔瓦的回答是: 我想知道是否有人能向我解释一下这段代码与后者的区别:Javascript 请解释这两者之间的区别;立即调用的函数表达式;及;自调用匿名函数“;,javascript,Javascript,受这个问题的启发,若昂·席尔瓦的回答是: 我想知道是否有人能向我解释一下这段代码与后者的区别: // Parameter to use var bar = 'bar'; // Go setTimeout( (function(arg1){ return function () { console.log(arg1); //ya arg1 has the value: 'bar'! } }(bar)), 2000); 我原以为括号会稍有不同,我知道这是一
// Parameter to use
var bar = 'bar';
// Go
setTimeout(
(function(arg1){
return function () {
console.log(arg1); //ya arg1 has the value: 'bar'!
}
}(bar)), 2000);
我原以为括号会稍有不同,我知道这是一个立即调用的函数表达式(我相信是Ben Alman创造的)与闭包结合在一起,但我并不完全理解这段代码是如何执行的
我想象的是一个由闭包调用的自调用匿名函数,我了解它是如何工作的,至少有点了解
// Parameter to use
var bar = 'bar';
// Go
setTimeout(
(function(arg1){
return function () {
console.log(arg1); //ya arg1 has the value: 'bar'!
}
})(bar), 2000);
所以这两个代码段都可以工作,而且这两个代码段之间只有一个括号的区别,而且我也不是javascript专家,但我直觉上觉得这两个javascript代码段都是非常跨浏览器兼容的。但是这两种代码之间到底有什么不同呢?这两种代码变体之间根本没有区别 此外,实际上括号是多余的。即使您以以下方式编写这段代码,它也可以工作:
// Go
setTimeout(
function(arg1){ // let's get rid of braces
return function () {
console.log(arg1); //ya arg1 has the value: 'bar'!
}
}(bar), 2000);
由于FunctionExpression
概念,它可以工作。括号仅用于区分FunctionExpression
s和FunctionDeclaration
。事实上,括号可以替换为任何运算符,例如~
注意:尽管本代码可以不用括号编写,但我强烈反对这样做,因为括号现在类似于一种模式或一个关键字,上面写着“看!我是无用的括号,放在这里可能是为了立即调用此函数”。这样代码就变得更清晰了
关于
FunctionExpression
vsFunctionDeclaration
的讨论很多,所以我不再重复了。看看过去的SO问题:您的示例没有多大意义,您的iLife应该返回一个func引用以设置为setTimeout的回调?您所拥有的将立即被调用。但两个代码段都不会立即被调用,都是在分配的2秒超时后被调用的…哎呀,对不起,您是对的,我更新了我的答案,现在两个js代码段都是在分配的2秒时间后被调用的,“立即调用的函数表达式”和“自调用匿名函数”是同义词。