请解释一下“;立即调用函数表达式“;以及“;自调用匿名函数”;
Please explain the differences between this "Immediately-Invoked Function Expression" and "Self Invoked Anonymous Function"
João Silva的答案受到这个Stackloverflow问题的启发:带参数的setTimeout
我想知道是否有人能向我解释一下这个代码片段与后者的区别:
// 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
和FunctionDeclaration
。事实上,括号可以替换为任何运算符,例如~
。
注意:即使我认为这段代码可以在没有括号的情况下编写,我也强烈反对这样做,因为括号现在有点像一个模式或关键字,上面写着"看!我是无用的括号,可能是出于某种原因放在这里的,比如立即调用这个函数"。因此,代码通过这种方式变得更加清晰。
网上有很多关于FunctionExpression
与FunctionDeclaration
的讨论,所以我不再重复了。看看过去的SO问题:函数表达式和Javascript中的声明有什么区别?
相关文章:
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 如何在Javascript函数调用中循环变量
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何远程检查JavaScript应用程序的函数调用堆栈
- javascript函数调用不起作用
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 如何通过函数调用设置图像的src
- 从全局函数调用Ember控制器上的方法
- 为什么Jquery$.ajax在函数调用中触发所有statusCode,即使调用成功
- JavaScript函数调用(arg1)(arg2)
- 打印链接时,将javascript函数调用到链接中
- 在函数调用中封装数据除了隐藏数据之外还有什么优点
- 无法从JavaScript中的函数调用对象属性
- 对中的函数调用进行排序是回调的唯一方法
- 函数调用方法有什么用
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- HTML5(Bootstrap)通过函数调用运行动画
- 函数调用不起作用
- 函数中的Javascript函数调用