javascript";静态进口“;

javascript";静态进口“;,javascript,namespaces,Javascript,Namespaces,javascript中是否有与java静态导入等效的内容?例如,如果我有一个Math类 com.example.Math = function() { function1(...) {} function2(...) {} } 现在,其中一些函数自然地链接在一起,这样一个函数的输出就是另一个函数的输入。我可以做类似的事情 com.example.Math.function2(com.example.Math.function1()); 这看起来有点难看,我真的想做一些类似的事

javascript中是否有与java静态导入等效的内容?例如,如果我有一个
Math

com.example.Math = function() {

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

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

com.example.Math.function2(com.example.Math.function1());
这看起来有点难看,我真的想做一些类似的事情:

function2(function1())

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

是的,有。它叫

也就是说:

不建议将
一起使用,并且在ECMAScript 5中禁止使用。建议的替代方法是将要访问其属性的对象指定给临时变量

例如:

var m = com.example.Math;
m.function2(m.function1());
那么:

var Math = com.example.Math;
然后:

Math.fn1( Math.fn2(...) );
func1( func2(...) );
我当然假设您的代码不是全局代码。(如果您不熟悉在JS中避免全局代码的概念,请阅读模块模式。)


您可以更进一步:

var Math = com.example.Math,
    func1 = Math.func1,
    func2 = Math.func2;
然后:

Math.fn1( Math.fn2(...) );
func1( func2(...) );

一个选项是使用闭包来包装对象。它不一定会消除对象本身,但它有助于提高可读性,如果您使用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);)
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));
但是,这会删除数学实例和函数之间的关系,因此如果方法依赖于实例变量,则可能会出现一些奇怪的行为。作为一个不起作用的例子,想象一下这个类:

com.example.Counter = {
    counter: 0,
    increment: function() { this.counter++; }
}

我会这样做:

(function(function1, function2) {
    function2(function1(...));
}(com.example.Math.function1, com.example.Math.function2);)
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));
注意
O.prototype.circ
方法中没有
Math
名称空间时如何使用
PI


在JavaScript中,名称空间和对象之间没有区别,因此有些人会认为
Math
不是名称空间,但由于JavaScript不支持这个概念,它就像
com.mycompany.somelibrary

一样是名称空间,我不熟悉它,但根据MDN:
不建议使用“with”,在ECMAScript 5严格模式下是禁止的。
是,
with
以严格语言抛出。我甚至不会再提它了。@WesleyMurch
with
(以及
eval
)当它被故意使用时是很好的。我只是想补充一下,因为最初的答案是简单的“是的,有。它被称为with”。我的第一个想法是使用一个变量,也许这终究是一个更好的解决方案。请看我对Sime的评论,了解我为什么在这种情况下更喜欢使用。这些函数是
数学的静态方法吗?
?虽然这会起作用,但我的最终目标是创建一个流畅的界面,其中的代码读起来就像一个人在代码之外编写它一样。因此,像sin(cos(x))这样的东西比Math.sin(Math.cos(x))更可取,特别是当一些操作变得更复杂时looking@JeffStorey我已经更新了我的答案。一般的方法是在本地环境中创建本地变量。