这两个javascript闭包语法之间的区别?

时间:2011-10-09 00:21:15

标签: javascript jquery jquery-plugins

  

可能重复:
  Is there a difference between (function() {…}()); and (function() {…})();?

我已经看到以下语法用于防止变量进入全局范围:

(function ($, undefined)
{

})(jQuery);

最近我看到代码这样做了:

(function ($, undefined)
{

} (jQuery));

我发现第一种方式对我来说最有意义。我精神上把它读作:

我已经定义了一个函数,我希望将它包装成一个表达式,(第一组括号)。该表达式是一个函数对象,我希望使用方法语法调用该函数对象,并且我传递给此函数对象的参数是jQuery。

第二种语法对我来说不太清楚,因为看起来外括号是不必要的。

我的javascript知识还不够好,还没有第二语法感觉舒服。 这些产生相同的行为吗?是否有任何区别?

如果你这样做会怎么样?

function ($, undefined)
{

} (jQuery);

3 个答案:

答案 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)

是的,这些在功能上是相同的。使用对你来说更直观的一个。