两种形式的自调用函数调用之间的区别是什么

What is a difference between 2 forms of self-invoking function call?

本文关键字:之间 区别 是什么 函数调用 两种 调用      更新时间:2023-09-26

我正在阅读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);

如果function是语句中的第一个令牌,则假定它是函数语句函数语句不是表达式,因此您不能立即调用它。

将左括号(放在function关键字之前,将其提升到表达式位置,因此您现在将有一个函数表达式,它将结束于右括号},因此您可以在那里调用它,无论它只是用括号括起来的函数表达式还是整个调用表达式。无论哪种方式,它都是一个表达式,因此可以调用它。

我认为一个函数要成为一个自调用函数,它必须具有以下调用形式:

你为什么这么认为?你必须思考为什么括号必须在那里——这只是为了解决JavaScript语法中的歧义,没有什么特别的。"自调用函数"只是一种模式,绝对不是一种特殊的语法。

一些人认为,第二种形式(将整个调用封装在括号中)更好,因为它更好地强调了自调用表达式的目的和完整性。