Javascript 为什么人们要向jQuery对象添加自己的自定义/用户函数?

Javascript 为什么人们要向jQuery对象添加自己的自定义/用户函数?,javascript,jquery,Javascript,Jquery,我见过人们将自己的自定义/用户函数添加到jQuery对象($)。例如: $.myUserFunc = function() { /* regular JS code */} 你为什么要这样做?与其使用$.myUserFunc,不如简单地将函数创建为myUserFunc,或者(如果希望避免污染全局范围)将其放在另一个自定义/用户对象上,如myObj.myUserFunc 您所询问的结构: $.myUserFunc = function() {} 在jQuery命名空间对象上创建静态函数(全局可

我见过人们将自己的自定义/用户函数添加到
jQuery
对象(
$
)。例如:

$.myUserFunc = function() { /* regular JS code */}

你为什么要这样做?与其使用
$.myUserFunc
,不如简单地将函数创建为
myUserFunc
,或者(如果希望避免污染全局范围)将其放在另一个自定义/用户对象上,如
myObj.myUserFunc

您所询问的结构:

$.myUserFunc = function() {}
在jQuery命名空间对象上创建静态函数(全局可用)。这与jQuery插件方法不同

有几个理由可以解释为什么会这样做——有些理由可能比其他理由更合理

  • 您可以创建与jQuery直接相关的jQuery实用程序函数(仅在使用jQuery时有用),但它的级别与插件方法不同

  • 您有一个全局函数,您不想将其放在全局名称空间中(由于避免使用许多顶级全局名称的所有典型原因),并且您碰巧使用了jQuery,因此您选择将全局函数放在jQuery namspace对象上

  • 在我看来,第一个是有道理的。如果它是特定于jQuery的函数,但它是一个全局函数,而不是jQuery对象的方法(就像插件一样),那么将它放在主jQuery上是有意义的。如果已经有一个合适的顶级名称空间,并且您的函数与该名称空间对象相关,那么就没有理由实现另一个顶级名称空间

    在我看来,第二个原因从建筑学的角度看没有那么有意义。如果此函数不是特定于jQuery的函数(例如,不使用或操作jQuery对象),则它实际上不属于jQuery对象。它是一个通用函数,应该以一种更通用的方式来定义,或者作为一个单例全局函数,或者,如果您有多种类型的相关函数,那么将其放在自己的命名空间对象中


    也就是说,在许多情况下,您可以创建自己的闭包并定义自己的函数供自己的代码使用,而不必将它们放在全局命名空间或命名空间对象中。因此,除非这些函数必须可以从任何地方全局访问,否则它们不需要放在jQuery对象上

    例如,假设有两个jQuery插件方法想要共享一个公共函数。显然,这个函数必须在这两个插件方法之外定义。但是,它不必在全球范围内定义。我可以这样结束和分享:

    // define closure
    (function() {
    
        // declare shared function in a closure
        function commonFunc() {
            // common code here
        }
    
        // define first plugin method
        jQuery.fn.plugin1 = function() {
            // do stuff
            // ....
    
            // use common function
            commonFunc();
        };
    
        // define other plugin method
        jQuery.fn.plugin2 = function() {
            // do different stuff
            // ....
    
            // use common function
            commonFunc();
        };
    
    })();
    

    使用myObj或myUserFunc会使全局计数翻一番,而不仅仅是$…@Morklympious:仅当它们是jQuery扩展时,否则您将不必要地面临冲突的风险。@dandavis我想将它们放在
    $
    全局上会更有意义,因为它不会导致命名冲突,并且很可能会为开发人员提供一个通用名称空间来抛出其函数。相关问题/答案:和。一般来说,人们在JS中做了很多奇怪的/愚蠢的/缓慢的/令人困惑的事情,这并不总是有一个很好的理由,但几乎所有的事情都是有效的。把东西放在美元上可以防止全球变暖,这是很多noobs认为最重要的事情。但是,如果注入jQuery或prototype的另一个副本,它也有被消灭的风险。在$上找到东西可能比在globals上更难,而且它紧密地结合了应该是两个独立的部分。我认为这不是一个好主意,但也不是最糟糕的事情。