帮助理解twitters widget.js文件,一个闭包内的闭包?

时间:2011-04-18 03:13:07

标签: javascript jquery twitter

http://a2.twimg.com/a/1302724321/javascripts/widgets/widget.js?1302801865

这样设置得很高:

public namespace:

TWTR = window.TWTR || {};

然后关闭:

(function() {
...

})(); // #end application closure

在应用程序闭包中:

TWTR.Widget = function(opts) {
    this.init(opts);
};
(function() {
    // Internal Namespace.
    var twttr = {};
})();

某些方法被标记为public,其他方法是私有的,唯一的区别似乎是命名约定(私有以下划线'_'开头)。

是否使用模块模式进行设计?

关闭时闭包的原因是什么或有什么好处?

因为他们在jquery之前加载widget.js,这意味着widget被设计为运行w / o jquery,因为顺序正确吗?

试图从这件事中学习!

1 个答案:

答案 0 :(得分:4)

  

这样设置得很高:

     

public namespace:

     

TWTR = window.TWTR || {};

这是错误的编码实践,变量应始终用var声明。并且javascript中没有“名称空间”,该术语适用于上述构造,但它并不合适。最好说它的方法包含在一个对象中。

  

然后关闭:

> (function() { ...
> 
> })(); // #end application closure

该模式被称为立即调用的函数表达式 iife 。不确定我喜欢这个名字,但你去了。无论如何,它不一定会创建任何有用的闭包。只有当一个函数创建了绑定到某个其他执行上下文的变量时,闭包才有用,这些上下文超出了创建它们的函数的生命周期(我希望它不像gobbledy-goop那样读取)。您不需要 iife 来创建闭包。

但是,您可以使用上述模式来创建闭包,因为它的功能与任何其他功能非常相似。

  

在应用程序闭包中:

> TWTR.Widget = function(opts) {
>     this.init(opts); }; (function() {
>     // Internal Namespace.
>     var twttr = {}; })();
  

有些方法标记为公开,其他方法   私人,唯一的区别似乎   成为命名惯例(私人   以下划线'_'开头。)

使用“公共”和“私人”在javascript中有点误导。使用下划线来启动标识符名称表示应该只在当前范围内使用,或者由“库”代码本身使用。它有点多余,因为代码应该有一个已发布的API,任何不属于API的方法都不应该是外部的。

但这主要是编码风格和个人偏好的问题。

  

是否使用模块模式进行设计?

Richard Cornford的“模块模式”就是这样一种模式。它可以方便地在javascript中模拟“私有”变量,也可以在函数或方法之间共享属性,而不是通常的原型继承。 widget.js可以使用模块模式实现(部分),但它可能是通过考虑需求和功能来设计的。 ; - )

  

关闭时闭包的原因是什么或有什么好处?

如上所述任何封闭的益处完全相同。基本上通过将变量放在作用域链的适当部分来访问变量与通过[[prototype]]链访问属性基本相同,只有(非常不同的)机制 - 一个在作用域链上使用标识符解析,另一个属性关于[[原型]]链的决议。

<强> 修改

一个缺点是,闭合变量所属的整个激活对象可能保留在内存中,因此如果您只需要访问共享变量,最好考虑其他一些方案,甚至可能是经典的原型继承。或者至少如果你要使用闭包,尽量保持相关的激活对象尽可能小(例如,在退出之前设置任何未用于null的变量)。

e.g。

var foo = (function() {

  // Variables available for closure
  var a, b, c;

  // Use a, b, c for stuff
  ...

  // Only want closure to c
  a = null;
  b = null;

  return function() {
    // use c
  }
}());
  

因为他们在jquery之前加载widget.js,这意味着widget被设计为运行w / o jquery,因为顺序正确吗?

我现在无法访问链接资源(公司阻止推特域名),但是加载顺序表明你是正确的。但是,某些代码执行可能会延迟,直到文档完全加载,因此它不是保证,您需要查看代码。