我正在互联网上寻找良好的JS实践并找到了一个有趣的实践(遗憾的是,我完全不了解它)
myNameSpace = function(){
var current = null;
function init(){...}
function change(){...}
function verify(){...}
return{
init:init,
change:change
}
}();
脚本来源:http://dev.opera.com/articles/view/javascript-best-practices/
答案 0 :(得分:1)
你也可以使用这样的代码,它可以让你编写OO JavaScript代码。您应该只在一个单元中组合内聚函数,并根据需要构建更多这样的对象。
请注意function buildFullName
是一个私有函数,因为它无法从外部访问。
如果没有以前的JavaScript知识,我同意你的看法令人困惑。事实是函数是JavaScript中的第一类对象。你可以在函数中嵌套函数,它们可以有变量,并且有很多种方法可以组合它们,没有像Java那样的标准方法。我认为文章JavaScript Closure 101可以帮助您清理一些事情。
/** This is our Object definition and constructor */
function Person(fname, lname) {
this.firstName = fname;
this.lastName = lname;
}
/** Anonymous function to avoid polluting the global namespace */
(function () {
/** This function will be defined public, we prefix the class name */
function Person_toString() {
//call buildFullName passing this, we could also call the function
//as buildFullName(), and it would work, but wouldn't have 'this'
return buildFullName.call(this);
}
/** Another public function */
function Person_buildGreeting() {
return "Hi " + this.firstName;
}
/** This function is private! */
function buildFullName() {
return this.firstName + " " + this.lastName;
}
/** Here we augment the Object with public functions */
Person.prototype = {
toString: Person_toString,
buildGreeting: Person_buildGreeting
};
})(); //execute the anonymous function immediately
使用示例:
var p1 = new Person('Jenny', 'Fairview');
alert("toString()=" + p1.toString());
alert("buildGreeting()=" + p1.buildGreeting());
答案 1 :(得分:0)
这是一篇很糟糕的文章,至少是关于避免全局变量的部分。当你的代码变得非常庞大以至于你会给它一个前缀时,就会出现这些事情,例如dojo
。所有/大多数dojo 函数都以dojo.
开头,因此当您加载它时,它不会覆盖您的函数(当然这假设您没有名为dojo
的函数或变量)
如果表格中有1000个功能
function init(){...}
function run(){...}
function start(){...}
他们所提出的论点是,它更容易做到
packageName = function{
function init(){...}
function run(){...}
function start(){...}
return {
init : init ,
run : run ,
start : start
}
比
packageName = function{
init : function init(){...} ,
run : function run(){...} ,
start : function start(){...}
}
我更喜欢后者。它更干净,更简洁,更少混淆。
答案 2 :(得分:0)
您可以更进一步,使用CommonJS或AMD模块构建您的应用程序,并完全避免全局变量。 Dojo正在向这个方向发展,但还没有从使用道场迁移过来。*