3

javascript中是否有与java静态导入等效的东西?例如,如果我有一个Math看起来像

com.example.Math = function() {

   function1(...) {}
   function2(...) {}

}

现在,其中一些函数自然地链接在一起,这样一个函数的输出就是另一个函数的输入。我可以做类似的事情

com.example.Math.function2(com.example.Math.function1());

这看起来有点难看,我真的很想做类似的事情:

function2(function1())

但我不想将 function1 和 function2 放在全局命名空间中。这可能吗?

4

4 回答 4

3

就在这里。它被称为with

with (com.example.Math) {
    function2(function1());
}

那说:

with不推荐使用,并且在 ECMAScript 5严格模式下被禁止。推荐的替代方法是将要访问其属性的对象分配给临时变量。

例如:

var m = com.example.Math;
m.function2(m.function1());
于 2013-01-14T22:50:46.630 回答
1

怎么样:

var Math = com.example.Math;

进而:

Math.fn1( Math.fn2(...) );

我当然假设您的代码不是全局代码。(如果您不熟悉在 JS 中避免使用全局代码的概念,请阅读模块模式。)


你可以更进一步:

var Math = com.example.Math,
    func1 = Math.func1,
    func2 = Math.func2;

进而:

func1( func2(...) );
于 2013-01-14T22:54:35.597 回答
1

我会做这样的事情:

var O = function() {
  var that = {};
  var PI = Math.PI;
  that.circ = function(r) {
    return 2*PI*r;  
  };
  return that;
};
var o = O();
console.log(o.circ(1));

请注意如何在方法中PI没有Math命名空间的情况下使用O.prototype.circ

在 JavaScript 中,命名空间和对象没有区别,所以有些人会争辩Math说它不是命名空间,但由于 JavaScript 不支持这个概念,所以它和com.mycompany.somelibrary.

于 2015-09-21T16:16:44.120 回答
0

一种选择是使用闭包来包装对象。它不一定会消除对象本身,但它有助于提高可读性,如果您使用的是 JS 压缩器,则可以帮助减少输出文件的大小:

(function(Math) {
    Math.function2(Math.function1(...));
}(com.example.Math);)

您还可以传入多个对象(即:)function(Math, Foo) {...}(com.example.Math, com.example.Foo)


如果您只想直接使用几个函数,只需像这样传递它们:

(function(function1, function2) {
    function2(function1(...));
}(com.example.Math.function1, com.example.Math.function2);)

但是,这消除了 Math 实例和函数之间的关系,因此如果您的方法依赖于实例变量,您可能会遇到一些奇怪的行为。作为一个不起作用的例子,想象这个类:

com.example.Counter = {
    counter: 0,
    increment: function() { this.counter++; }
}
于 2013-01-14T22:59:53.360 回答