我正在阅读Backbone.js带注释的源代码 http://backbonejs.org/docs/backbone.html 并注意到一种奇怪的(对我而言)形式的函数调用
(function(root, factory) {
// omitted
root.Backbone = factory(root, exports, _, $);
// omitted
}(this, function(root, Backbone, _, $) { /* omitted */ })); <---- HERE
我无法理解为什么他们选择这种形式的立即函数调用,其参数是在大括号}(params)
之后指定的,而不是在函数结束括号)(params)
之后,如下面的第二个例子所示。
以下是简化示例。
第一个示例返回错误未捕获的SyntaxError:意外的令牌(
function(x, y) {
return x + y;
}(10, 20);
当第二个例子执行一个函数时,返回30
(function(x, y) {
return x + y;
}(10, 20));
为什么选择第二个例子?我想让一个函数成为一个自我调用它必须有这种形式的调用:
(function(x, y) {
return x + y;
})(10, 20);
答案 0 :(得分:2)
如果function
是语句中的第一个标记,那么它被假定为函数语句。函数语句不是表达式,所以你不能立即调用它。
在(
关键字之前放置左括号function
会将其提升到表达式位置,因此您现在将拥有一个函数表达式,它将在结束时结束{{ 1}},所以你可以在那里调用它,无论它是否只是括在括号中的函数表达式或整个调用表达式。它是一种表达方式,所以你可以调用它。
我认为函数成为一个自我调用它必须有这种形式的调用:
为什么你认为是这样的?你必须考虑为什么括号必须在那里 - 它只是解决JavaScript语法中的模糊性,没有什么特别的。 &#34;自我调用功能&#34;只是一种模式,绝对不是一种特殊的语法。
有些人认为第二种形式(将整个调用包含在括号中)更好,因为它更好地强调了自我调用表达式的目的和完整性。