【问题标题】:The benefits of the new jQuery's library wrapping technique新的 jQuery 库包装技术的好处
【发布时间】:2011-10-15 12:08:16
【问题描述】:

我只是注意到 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;       
   })();
})(...);

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

【问题讨论】:

  • 这让我很困惑。您刚刚发布了闭包的开始。
  • 什么闭包?它只是那里的局部变量...你可以在 jQuery 源代码中看到那些...虽然我没有发布整个代码,我现在只想了解它改变库包装技术的好处...
  • 第一个var jQuery 基本上可以让你拥有私有变量。我假设除非你调用它,否则第二个jQuery 中的任何东西都会被启动,但我不能 100% 确定它。我知道第一个 jQuery 调用允许里面的内容是私有的,直到你 return 它。
  • 是的,基本上,两个版本的代码都会生成私有变量,以防止不必要的变量污染全局命名空间(这就是库包装的内容)。在第二个代码中,当第一个 jQuery 启动时,它返回第二个 jQuery 作为结果。所以我认为第一个代码比第二个更直接,并且想知道这样做的好处在哪里,因为对我来说每个代码背后都必须有一个原因...... :)

标签: jquery word-wrap


【解决方案1】:

我认为这本身并不完全是“库包装”——外部匿名函数仍在包装整个库。我认为您在这里看到的是部分 jQuery 代码,尤其是定义核心功能的部分,使用 Module pattern 将部分代码保持在有限范围内。

例如,如果您查看the core.js source file,您会看到第 4-77 行定义了大量变量 - 您可以看到为什么您不希望所有这些都在其余部分的变量范围内徘徊图书馆。模块模式有助于最大程度地减少大量代码中的冲突和混乱,我猜测他们在 v.1.4 之后开始使用这种模式的原因是代码库变得更大更复杂。所以我认为你在最终库中看到的并不是从优化的角度来看更紧凑的代码,而是从维护的角度来看更健壮的代码。

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

【讨论】:

  • 我将其称为“库包装”,正如 John Resig 自己在他即将出版的书“JavaScript Ninja 的秘密”(我有未经编辑的草稿版本)中提到的那样,它的意思就是这样,外部匿名函数实际上包装了整个库,并且只将必要的变量(jQuery)引入了全局命名空间......嗯,也许它只是另一种模块模式实现......我同意你的观点,也许是最后一个编写代码只是为了方便将来维护。它只是让我好奇,也许它在优化方面也有一些好处......
  • 我的意思是内部匿名函数不是“库包装”的一部分,而是内部库代码的一部分。您的两个示例中的库包装没有改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 2023-03-29
  • 2016-11-28
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
相关资源
最近更新 更多