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

时间:2014-08-25 19:37:00

标签: javascript jquery

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

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

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

1 个答案:

答案 0 :(得分:3)

您要问的构造:

$.myUserFunc = function() {}

在jQuery名称空间对象上创建一个静态函数(全局可用)。这与jQuery插件方法不同。

为什么有人可能会这样做有几个原因 - 有些可能比其他人更合理。

  1. 您可以创建一个与jQuery直接相关的jQuery实用程序函数(仅在使用jQuery时有用),但与插件方法处于不同的级别。

  2. 你有一个全局函数,你不想把它放在全局命名空间中(出于避免使用大量顶级全局名称的所有典型原因)而你碰巧正在使用jQuery所以您选择将全局函数放在jQuery namspace对象上。

  3. 在我看来,第一个是有道理的。如果它是一个特定于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();
        };
    
    })();