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

前端之家收集整理的这篇文章主要介绍了javascript – 帮助理解twitters widget.js文件,一个闭包内的闭包?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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,唯一的区别似乎是命名约定(私有以下划线’_’开头).

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

封闭内闭合的原因是什么或有什么好处?

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

只是想从这个东西中学习!

最佳答案

It is setup like this at a high level:

public namespace:

TWTR = window.TWTR || {};

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

Then a closure:

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

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

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

Within the application closure:

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

Some methods are marked public,others
private,and the only difference seems
to be the naming convention (private
starts with underscore ‘_’).

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

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

Is it designed using the module pattern?

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

猜你在找的jQuery相关文章