4

我有一个变量api,其中我有更多要在测试变量中使用的方法,并且两者都在全局上下文中。

我认为如果我把它们放在 window.document 上会更好,我想知道还有什么其他选择。

var api = (function(){

  this.run= function(){
    console.log("run api");
  };

  return this;

})();

// 测试在单独的文件中

var test = (function(one_){

  this.as = function(){
    console.log(one_.run());
  };


  return this;

})(one);


test.as();
4

3 回答 3

4
var company = company || {} ;

company.doSomething = function() {
};

company.test = {};
company.test.submodule = {};
company.test.submodule.doSomething = function() {};

company.api = {};
company.api.submodule = {};

您通常应该避免全局定义变量。对于清晰可维护的代码,使用对象作为命名空间,避免污染全局命名空间。

这也极大地增强了默认的 JS 功能。如果你真的很喜欢它,require.js在你的项目中添加类似的东西,你会得到一个非常棒的类似 Java 的功能。

因此,使用require.js,您的company.apicompany.test可以放置在不同的文件中,并且可以彼此放置require,就像import company.test使用 Java一样package

命名空间是一种非常有效的做法。你得到:

  1. 可读性(世界上最重要的事情!!)。
  2. 可维护性。
  3. 更快的调试。
  4. 更快的升级。
  5. 逻辑和功能的有效划分。
  6. 防止 IEwindowglobal对象错误。
  7. 使团队工作变得可能和愉快。
  8. 加快了开发速度。大多数 IDE 将索引并自动填充您的命名空间对象。
  9. 您可以有效地使用 jsDoc 标签来记录您的 JavaScript 代码。

重要的

this在静态上下文中使用它也相当危险。JavaScript 命名约定规定静态将以小写字符开头命名,类将以大写字符开头定义,当然使用 camelCase。

再次,一个非常强大和有用的约定。它告诉开发人员眨眼间某事是静态的或类。例如,如果您有:

company.test.submodule.doSomething = function() {
    // this is a static function. It's a normal property, it's not nested under the prototype.
};

相反,如果你想创建一个类,你可以this以正确的方式使用引用。

   // Notice Person starts with uppercase P.
company.test.subModule.Person = function(name) {
    this.name = name;
    this.numberOfEyes = 2;
};
company.test.subModule.Person.prototype.cryMeARiver = function() {
    console.log(this.name + " can cry a river.");
};

现在在任何其他功能中,您可以执行以下操作:

company.api.someSubModule.peopleCryRivers = function() {
    // this is again a static context.
    var bodgan = new company.test.subModule.Person("Bogdan");
    var andreea = new company.test.subModule.Person("Andreea");
    bodgan.cryMeARiver();// will output "Bogdan can cry a river."
    andreea.cryMeARiver();// will output "Andreea can cry a river."
    // etc..
};
于 2013-04-22T12:17:10.333 回答
2

恕我直言,在全局命名空间(即window)和window.document.

有时(特别是从多个源模块访问变量时)您只需要创建一个全局变量,因此当您这样做时,请使用命名空间来封装您的变量,将命名空间本身作为唯一泄露的变量:

模块一:

var BOGDAN = BOGDAN || {};
BOGDAN.api = ...

模块 2:

var BOGDAN = BOGDAN || {};
BOGDAN.test = ...
于 2013-04-22T12:09:19.430 回答
1

将变量附加到window.document对我来说没有意义,而将它们附加到window与在全局命名空间中声明相同。

您可以创建(全局)变量作为命名空间并将其他变量附加到此。

var APP = {};
APP.api = ...

这当然会冒与另一个名为“APP”的对象发生冲突的风险。

另一种选择是简单地将变量包装在立即调用的函数表达式中。

(function() {
    var api = ...
}();

这将使它们在 IIFE 范围内,它们不能在其中产生冲突。这也意味着当您的变量超出范围时,它们将有资格进行垃圾收集。

于 2013-04-22T12:40:33.763 回答