两种形式的自调用函数调用之间的区别是什么
What is a difference between 2 forms of self-invoking function call?
我正在阅读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语法中的歧义,没有什么特别的。"自调用函数"只是一种模式,绝对不是一种特殊的语法。
一些人认为,第二种形式(将整个调用封装在括号中)更好,因为它更好地强调了自调用表达式的目的和完整性。
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- javascript函数的:和=之间的区别
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 函数中this和var之间的区别
- “util.inherits”和在NodeJS中扩展原型之间的区别
- Math.min()和Math.max()之间有什么区别?在Javascript中
- webpack开发模式和生产构建模式之间有什么区别
- servlet和代理servlet之间的区别
- Javascript 类型未定义和 void 之间的区别
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 布局引擎和javascript引擎之间的区别
- 什么's extjs中的mon()和on()之间的区别
- type=text/javascript和language=javascript之间的区别
- 函数()和新函数()之间的区别
- JavaScript中let和var之间的区别
- 蓝鸟的done()和spread()之间的区别
- Node.js HTTP/NET——连接和请求之间的区别