这种JavaScript立即调用模式的原因是什么?

njr*_*101 5 javascript jquery design-patterns

在查看SlickGrid源代码时,我遇到了以下模式:

(function ($) {
  var SlickEditor = {

    TextCellEditor: function (args) {
      ...
    },

    LongTextCellEditor: function (args) {
      ...
    }
  };

  $.extend(window, SlickEditor);

})(jQuery);
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,它使用立即调用来定义各种函数对象,然后将它们合并到全局命名空间中.

所以我可以像这样全局定义我的函数,它会产生相同的效果,对吧?

function TextCellEditor (args) {
  ...
}

function LongTextCellEditor (args) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一区别是,在第一个版本中,我可以用$速记来引用该jQuery对象.除此之外,两种情况下的结果都是相同的.

我想知道我是否遗漏了什么.也许还有另外一个很好的理由这样做?

更新:请注意,我意识到使用这种立即调用模式允许使用匿名函数中声明的私有变量.但是在这种情况下没有声明任何变量,并且函数无论如何都被注入到全局范围中.所以我还是想知道是否有任何真正的区别.

一些答案指出,引用局部变量比引用全局变量要快得多.如果我$TextCellEditor()构造函数中引用,这仍然适用.因为它是在外部匿名函数的范围内定义的,所以它$不是本地的TextCellEditor().

所有评论赞赏.

Mar*_*sen 3

不同之处在于,当您使用像您所展示的那样的自调用函数时,您正在为私有变量创建本地范围。

这种类型的自调用函数通常称为闭包,是许多 javascript 模式(如模块模式)的基础:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

您可以在这里阅读有关 javascript 作用域的更多信息:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

传递 jQuery 变量的原因有两个:

1:通过 $ 调用它更方便,因为它是作为局部变量传入的,我们可以确定 $ 不是其他东西

2:速度更快——局部变量的访问和使用比全局变量要快得多

作为示例,请看以下代码块:

var public_and_global=true;

(function(){
  var private_and_local = true;

  function local_func() {
   //can use private_and_local as well as public_and_global
  }

})();

function global_func() {
   //can only use public_and_global
}
Run Code Online (Sandbox Code Playgroud)