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

Javascript 帮助理解twitters widget.js文件,一个闭包中的闭包?,javascript,jquery,twitter,Javascript,Jquery,Twitter,在高级别上的设置如下: 公共命名空间: TWTR = window.TWTR || {}; 然后结束: (function() { ... })(); // #end application closure 在应用程序关闭中: TWTR.Widget = function(opts) { this.init(opts); }; (function() { // Internal Namespace. var twttr = {}; })(); 有些方法被标记为pu

在高级别上的设置如下:

公共命名空间:

TWTR = window.TWTR || {};
然后结束:

(function() {
...

})(); // #end application closure
在应用程序关闭中:

TWTR.Widget = function(opts) {
    this.init(opts);
};
(function() {
    // Internal Namespace.
    var twttr = {};
})();
有些方法被标记为public,有些方法被标记为private,唯一的区别似乎是命名约定(private以下划线“\ux”开头)

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

为什么在一个闭包中进行闭包会给您带来什么好处

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

只是想从中学习

在高级别上的设置如下:

公共命名空间:

TWTR = window.TWTR || {};
TWTR=window.TWTR | |{}

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

然后结束:

(function() {
...

})(); // #end application closure
这种模式被称为立即调用的函数表达式或iife。我不确定我喜欢这个名字,但你看。无论如何,它不一定会创建任何有用的闭包。闭包只有在函数创建的变量绑定到其他执行上下文时才有用,这些执行上下文在创建它们的函数的生命周期之外仍然存在(我希望这读起来不像gobbledy goop)。你不需要一个生命来创造一个终结

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

在应用程序关闭中:

TWTR.Widget = function(opts) {
    this.init(opts);
};
(function() {
    // Internal Namespace.
    var twttr = {};
})();
有些方法标记为public,有些方法标记为public 私人的,唯一的区别似乎是 作为命名约定(专用) 以下划线“\”开头

在javascript中使用“public”和“private”有点误导。使用下划线来开始标识符名称表示某些内容只应在当前范围内使用,或由“库”代码本身使用。这有点多余,因为代码应该有一个已发布的API,任何不属于API的方法都不应该在外部可用

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

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

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

为什么在一个闭包中进行闭包会给您带来什么好处

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

编辑

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

e、 g

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


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

这些并不完全正确。它们是,如果它们使用在其函数范围之外定义的变量,则可能会创建闭包。闭包实际上是什么:“函数的局部变量-在函数返回后保持活动状态。”另一个关于闭包的好读物:顺便问一下,这个.init(..)函数是在哪里定义的?