新的jQuery库封装技术的好处

3

我注意到jQuery源代码在其库包装技术方面有一些变化。据我记得,在1.4版本中,他们使用了以下库包装方式:

(function(...){
   var jQuery = function(){
    // some code
   }
   // other code    
})(...);

现在在1.6.x中:

(function(...){
   var jQuery = (function(){
      var jQuery = function(){
        // some code
      }
      // other code 
      return jQuery;       
   })();
})(...);

只是一个想法,有没有人知道这些变化(包装技术)的好处是什么?


这让我感到困惑。你刚刚发布了闭包的起源。 - Seth
什么闭包?那只是本地变量...你可以在jQuery源代码中看到它们...虽然我没有发布整个代码,但我只想知道更改库封装技术的好处... - Habib Rosyad
第一个 var jQuery 基本上允许您拥有私有变量。我认为除非您调用它,否则不会初始化第二个 jQuery 中的任何内容,但我对此并不完全确定。我知道第一个 jQuery 调用允许内部内容在您 return 它之前保持私有。 - Seth
基本上,这两个版本的代码都会生成私有变量,以防止用不必要的变量污染全局命名空间(这就是库包装的作用)。在第二个代码中,由于第一个jQuery被初始化,它将第二个jQuery作为结果返回。所以我认为第一个代码比第二个更直接,而且想知道其中的好处,因为对我来说,每个代码都必须有其背后的原因... :) - Habib Rosyad
1个回答

0

我认为这不完全是“库封装” - 外部匿名函数仍然包含整个库。我认为你在这里看到的是jQuery代码的某些部分,特别是定义核心功能的部分,使用模块模式将代码的部分保持在有限的范围内。

例如,如果你查看core.js源文件,你会发现4-77行定义了大量变量 - 你可以看到为什么你不想让所有这些变量挂在库的其余变量作用域中。模块模式有助于最小化大量代码中的冲突和混淆,并且我猜测他们在v.1.4之后开始使用这种模式的原因是代码库变得更大更复杂了。所以我认为你在最终库中看到的不是来自优化角度的更紧凑的代码,而是来自维护角度更健壮的代码。

我不是jQuery开发人员,所以当然这都是猜测。但这似乎是一个合理的解释。


我将其称为“库封装”,正如John Resig在他即将出版的书《JavaScript Ninja的秘密》中所提到的那样(我有未编辑草稿版本),它的确是这个意思,外部匿名函数实际上包裹了整个库,并且仅向全局命名空间引入必要的变量(jQuery)...嗯,也许它只是另一种模块模式实现方式...我同意你的观点,也许最后的代码只是为了将来易于维护。但这让我很好奇,也许在优化方面也有一些好处... - Habib Rosyad
我想表达的是,内部匿名函数并不是“库封装”的一部分,而是内部库代码的一部分。在你的两个示例中,库封装没有改变。 - nrabinowitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,