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,其他方法标记为private,唯一的区别似乎是命名约定(private以下划线'_'开头)。

它是使用模块模式设计的吗?

封包内的封包为什么或给您带来什么好处?

因为它们在jquery之前加载了widget.js,这意味着小部件被设计为不使用jquery,因为顺序是否正确?

只是想从这件事中学习!

最佳答案



那是不好的编码习惯,变量总是用var声明。而且javascript中没有“命名空间”,该术语适用于上述结构,但实际上并不恰当。最好说它的方法包含在一个对象中。


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

该模式已被称为立即调用的函数表达式或iife。不知道我喜欢这个名字,但是你去了。无论如何,它不一定会创建任何有用的闭包。仅当函数创建的变量与其他执行上下文绑定(bind)时才有用,而其他执行上下文的生存时间超出了创建它们的函数的生命周期(我希望不会像gobbledy-goop那样读)。您不需要创建一个闭合就可以。

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


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



在JavaScript中,“公共(public)”和“私有(private)”的使用有点误导。使用下划线开头标识符名称表示某些内容仅应在当前范围内使用,或由“库”代码本身使用。这有点多余,因为代码应具有已发布的API,并且任何不属于API的方法都不应在外部使用。

但这很大程度上取决于编码风格和个人喜好。



理查德·康福德(Richard Cornford)的“模块模式”就是这样一种模式。这对于在javascript中模拟“私有(private)”变量非常方便,并且除了通常的原型(prototype)继承以外,还可以在函数或方法之间共享属性。可以使用模块模式(部分地)实现widget.js,但它可能是通过考虑需求和功能来设计的。 ;-)



与上述任何闭包完全相同的好处。本质上通过将变量放置在作用域链的适当部分来访问变量与通过[[prototype]]链访问属性本质上是相同的,只是在(非常不同的)机制上-一种在作用域链上使用标识符解析,另一种属性[[prototype]]链上的分辨率。

编辑

一个缺点是,封闭变量所属的整个激活对象可能保留在内存中,因此,如果您只需要访问共享变量,则最好考虑其他方案,甚至可以考虑经典原型(prototype)继承。或者至少如果要使用闭包,请尝试使相关的激活对象尽可能地小(例如,在退出前将所有不使用null的变量设置为空)。

例如
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
  }
}());



我现在无法访问链接的资源(对Twitter域进行了完全阻止),但是加载顺序表明您是正确的。但是,某些代码执行可能会延迟到文档完全加载后才能执行,因此这不能保证,您需要查看代码。

关于javascript - 帮助了解twitters widget.js文件,闭包内部的闭包吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5698144/

10-16 23:23