可能重复:
Is there a difference between (function() {…}()); and (function() {…})();?
我已经看到以下语法用于防止变量进入全局范围:
(function ($, undefined)
{
})(jQuery);
最近我看到代码这样做了:
(function ($, undefined)
{
} (jQuery));
我发现第一种方式对我来说最有意义。我精神上把它读作:
我已经定义了一个函数,我希望将它包装成一个表达式,(第一组括号)。该表达式是一个函数对象,我希望使用方法语法调用该函数对象,并且我传递给此函数对象的参数是jQuery。
第二种语法对我来说不太清楚,因为看起来外括号是不必要的。
我的javascript知识还不够好,还没有第二语法感觉舒服。 这些产生相同的行为吗?是否有任何区别?
如果你这样做会怎么样?
function ($, undefined)
{
} (jQuery);
答案 0 :(得分:3)
如果在行的开头出现function
关键字,则将其解析为 function 语句声明。 Funcsion语句需要一个函数名,因此不允许你提供的第三个选项(你可以自己测试)。
如果function
关键字出现在其他位置,则会将其解析为函数表达式,并且可以是匿名的。有很多方法可以做到这一点,但您所显示的模块模式的约定是将构造包装在括号中。 (有些字节保护程序,比如使用像+或〜这样的一元运算符)
如果您选择使用括号内的最后一个(第一个版本)或外部(第二个版本)是个人喜好的问题。我更喜欢第二个,因为括号包裹整个模式而不仅仅是函数。
答案 1 :(得分:3)
你看到第二种方式完成的原因只是一个惯例问题。很多人通过jslint.com(或node-jslint)运行代码。默认情况下,lint工具会抱怨立即函数的第一个版本。
要查看此操作,请将以下代码粘贴到jslint.com上的textarea并运行该工具:
/*jslint devel: true, browser: false, sloppy: false, maxerr: 50, indent: 4 */
(function (a) {
'use strict';
alert(a); // Yay!
}("Yay!"));
(function (b) {
'use strict';
alert(b); // Yay!
})("Yay!");
答案 2 :(得分:2)
是的,这些在功能上是相同的。使用对你来说更直观的一个。