Jquery Javascript转换为命名空间和调用函数

Jquery Javascript转换为命名空间和调用函数,jquery,javascript-namespaces,Jquery,Javascript Namespaces,我是一个典型的web开发人员,在JS中使用全局。我现在看到了曙光,希望转换为名称空间。因此,在我当前的项目中,我有一个页面,它有三个JS函数(当前都是全局函数),当调用这些函数时,它们会将文本分配给锚定并附加click方法,以切换特定div的可见性。非常标准 因此,示例函数编写为: function toggleComments(){ $("comments-section").hide(); $("comments-button").click(function (){

我是一个典型的web开发人员,在JS中使用全局。我现在看到了曙光,希望转换为名称空间。因此,在我当前的项目中,我有一个页面,它有三个JS函数(当前都是全局函数),当调用这些函数时,它们会将文本分配给锚定并附加click方法,以切换特定div的可见性。非常标准

因此,示例函数编写为:

function toggleComments(){
   $("comments-section").hide();
   $("comments-button").click(function (){
      blah
      return false;
   });
}
我的问题是如何创建一个名称空间来保存这些函数,然后调用它们

我找到了各种各样的例子,但没有什么结论

任何帮助都会很好

// choos a namespace name that will not conflict with existing global variables
var myNS = {
        toggleComments: function(){
            $("comments-section").hide();
            $("comments-button").click(function (){
                // blah
                return false;
            });
        },
        anotherFunc: function(){
            return "something";
        }
}

// called like this
myNS.toggleComments();
alert( myNS.anotherFunc() );
此外,您应该尝试将代码包含在匿名自调用函数中。这意味着您可以在全局命名空间中没有任何内容,因此没有污染的风险

// other peoples/modules code
var myVariable = "whatever";

// anonymous function for your self contained code
(function(){
var myVariable = "inside anonymous function";
alert(myVariable);
})() // the empty brackets envoke the anonymous function

// still retains value from before your self envoking anonymous function
alert(myVariable);

billy moon显示了一个良好的开端,但使用对象文字的问题是,您无法交叉引用其他字段/函数/属性

我更喜欢显示模块模式(请参阅)

显示模块模式结合了一个自执行函数、一种利用闭包(各种)来提供内部私有函数/字段的方法,并允许您传递参数来初始化名称空间对象

var namespacedObject = function(param) {

    var settings = param || someDefaultSetting, //default if no param supplied
        somePrivateField = "someValue",
        somePublicField = "i'm public";

    //define some method we will later make public
    function toggleComments(){
        $("comments-section").hide();
        $("comments-button").click(function (){
             $(this).value= somePrivateField;
             return false;
        });
    }

    //this is where the magic happens, 
    //return object with all public fields/functions
    return { 
        toggleComments : toggleComments,
        somePublicField : somePublicField
    };

}(someParam);
您可以看到,名称空间对象包含一个私有字段
somePrivateField
,可以从公开访问的方法引用该字段。另外,请注意,我已经公开了一个公共字段,并接受了一些参数,我可以在函数等中使用/引用这些参数(如果没有传入任何内容,您可以将其默认为某个默认值)

可以这样使用:

namespacedObject.toggleComments();
alert(namespacedObject.somePublicField);
alert(namespacedObject.somePrivateField); //undefined - it's private of course!
我喜欢这样做的一个原因是,只要看一下自执行函数返回的对象文本,就很容易看到什么是公共/私有的

希望对你有帮助