【发布时间】:2012-01-18 12:30:56
【问题描述】:
我在查看SlickGrid 源代码时遇到了以下模式:
(function ($) {
var SlickEditor = {
TextCellEditor: function (args) {
...
},
LongTextCellEditor: function (args) {
...
}
};
$.extend(window, SlickEditor);
})(jQuery);
如果我理解正确的话,它是使用立即调用来定义各种函数对象,然后将它们合并到全局命名空间中。
所以我可以像这样在全局范围内定义我的函数,它会产生相同的效果,对吧?
function TextCellEditor (args) {
...
}
function LongTextCellEditor (args) {
...
}
我能看到的唯一区别是,在第一个版本中,我可以使用$ 简写来引用jQuery 对象。除此之外,两种情况下的结果都是相同的。
我想知道我是否遗漏了什么。这样做可能还有另一个很好的理由?
更新:请注意,我意识到使用这种立即调用模式允许使用在匿名函数中声明的私有变量。但是在这种情况下没有声明任何变量,并且函数无论如何都被注入到全局范围中。所以我仍然想知道是否有任何真正的区别。
一些答案指出,引用局部变量比引用全局变量要快得多。如果我在TextCellEditor() 构造函数中引用$,这是否仍然成立。 $ 并不是 TextCellEditor() 真正的本地,因为它是在外部匿名函数的范围内定义的。
感谢所有 cmets。
【问题讨论】:
-
... 所示示例将单个变量注入全局范围。您将多个函数注入全局范围。一个全局变量和多个全局变量之间存在巨大差异
-
@Raynos:两个示例都将相同的函数注入全局范围。
$.extend()调用扩展了具有SlickEditor的所有属性的窗口对象(在本例中为两个构造函数)。这就是我的问题的重点 - 有什么区别? -
哦,等等,我没有意识到 SlickEditor 作者是个白痴,并将所有功能都注入了全局范围。这是一种反模式,两个代码示例都是不好的做法。
标签: javascript jquery design-patterns