我是一个典型的Web开发人员,它在JS中用于全局。我现在已经看到了光,并希望转换为命名空间。因此,在我当前的项目中,我有一个页面,它有三个JS函数(当前全局),当调用时将文本分配给锚点并附加单击方法来切换特定div的可见性。很标准。
所以示例函数写成:
function toggleComments(){
$("comments-section").hide();
$("comments-button").click(function (){
blah
return false;
});
}
我的问题是如何创建一个命名空间来保存这些函数然后调用它们?
我找到了不同的例子,但没有结论。
任何帮助都会很棒。
答案 0 :(得分:2)
// 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);
答案 1 :(得分:1)
我更喜欢揭示模块模式(参见http://www.wait-till-i.com/2007/08/22/again-with-the-module-pattern-reveal-something-to-the-world/)
揭示模块模式结合了自执行功能,利用闭包来提供内部私有函数/字段,并允许您传递参数来初始化命名空间对象。
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!
我喜欢这个的一个原因是,通过浏览从自执行函数返回的对象文字,很容易看到什么是公共/私有
希望有用