这对我的 jQuery 脚本来说是一个好的结构吗?

Posted

技术标签:

【中文标题】这对我的 jQuery 脚本来说是一个好的结构吗?【英文标题】:Is this a good structure for my jQuery scripts? 【发布时间】:2011-11-23 03:58:32 【问题描述】:

我想将我的脚本组织在我所有网站的一个 .js 文件中(我现在一团糟),比如 C# 中的命名空间和类...

(function ($) 

    //private variables
    $.divref = $("#divReference");

    //Namespaces
    window.MySite = ;
    window.MySite.Home = ;
    window.MySite.Contact = ;

    //Public function / method
    window.MySite.Home.Init = function(params)
        alert("Init");

        MySite.Home.PrivateFunction();

        $.divref.click(function()
            alert("click");
        );
    ;

    //private function / method
    MySite.Home.PrivateFunction = function()
        alert("Private");
    ;

)(jQuery); 

这是 jQuery 和 JScript 中惯用的布局吗?

【问题讨论】:

您创建私有变量的方法是错误的。您将它们附加到 $ 对象,该对象将在您的代码完成执行后存在。你想要一个闭包。 @g.d.d.c 这将是一个很好的答案。 【参考方案1】:

我将继续发表我的评论作为答案,尽管我不是 100% 它解决了您关于 c# 命名空间及其在 javascript 中的相似性的问题(我不是 c# 程序员)。您实际上并没有创建私有变量,因为您将它们附加到此函数完成后将存在的 $ 对象。如果你想要私有变量,你需要使用闭包。这些看起来像这样:

var myObject = function () 
  var innerVariable = 'some private value';

  return 
    getter: function () 
      return innerVariable;
    
  
()

如果您尝试访问myObject.innerVariable,它将返回undefined,但如果您调用myObject.getter(),它将正确返回该值。这个概念是你想要在 JavaScript 中阅读的一个概念,也适用于一般的编程。希望对您有所帮助。

【讨论】:

是的,你是对的,我没有注意到这一点。它们是公共变量然后-。谢谢【参考方案2】:

这更像是我将如何实现您正在尝试做的模式:

// MySite.Home Extension
window.MySite = 
    (function ($, root) 

        //private variables
        var $divref = $("#divReference");

        //private function / method
        var privateFunction = function()
            alert("Private");
        ;        

        root.Home = ;

        // Public variable
        root.Home.prop = "Click"

        //Public function / method
        root.Home.Init = function(params)
            alert("Init");

            private();

            $divref.click(function()
                alert(root.Home.prop);
            );
        ;

        return root;

    )(jQuery, window.MySite ||  );   

// MySite.Contact Extension
window.MySite = 
    (function ($, root) 

        root.Contact = ;

        // More stuff for contact

        return root;

    )(jQuery, window.MySite ||  ); 

第一个更改是将每个“命名空间”拆分为自己的模块模式,因此私有变量不会从命名空间流向命名空间(如果您确实打算将它们私有到命名空间,这将更像 C# esque)。其次,不是访问window.MySite,而是传入要扩展的对象(在这种情况下,我称之为root)。这会给你一些灵活性。

您的 私有方法 并不是真正私有的。要创建私有方法,您只需要创建一个函数 var,它绑定在闭包中,但不分配给外部可见对象的属性。最后,您可能不想使用$.somegarbage。就像评论中提到的那样,您正在向 $ 对象添加一个属性,当关闭完成时该属性仍然存在。如果您想要接近的东西,我会使用 $somegarbage,有些人似乎喜欢这样做,但是任何变量名称都适用于私有变量,只要变量绑定在闭包范围内(而不是其他地方)

你在正确的轨道上......

【讨论】:

【参考方案3】:

您可能需要阅读 JavaScript 中的 Module pattern (more) 和闭包,以防止污染全局命名空间。

【讨论】:

以上是关于这对我的 jQuery 脚本来说是一个好的结构吗?的主要内容,如果未能解决你的问题,请参考以下文章

好的语音识别API

用于缩小 CSS 的 Python 脚本? [关闭]

Azure Devops 中的交换服务结构

使用Blogger或WordPress会对我的网站排名产生任何影响吗?

这对嵌套类来说是个好情况吗?如果是这样,它应该是静态的吗? [复制]

Javascript 字符串大小限制:对我来说是 256 MB - 所有浏览器都一样吗?