需要帮助了解如何使用名称空间:(

时间:2011-10-31 03:32:59

标签: javascript workspace

我正在互联网上寻找良好的JS实践并找到了一个有趣的实践(遗憾的是,我完全不了解它)

myNameSpace = function(){
  var current = null;
  function init(){...}
  function change(){...}
  function verify(){...}
  return{
    init:init,
    change:change
  }
}();
  • 我在哪里可以使用此名称空间?
  • 我如何使用名称节奏?
  • 使用此而不是Global?
  • 是否真的好主意

脚本来源:http://dev.opera.com/articles/view/javascript-best-practices/

3 个答案:

答案 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正在向这个方向发展,但还没有从使用道场迁移过来。*