【问题标题】:javascript "static imports"javascript“静态导入”
【发布时间】:2013-01-14 22:50:10
【问题描述】:

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

com.example.Math = function() {

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

}

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

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

这有点难看,我真的很想做这样的事情:

function2(function1())

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

【问题讨论】:

  • 那些函数是Math的静态方法吗?

标签: javascript namespaces


【解决方案1】:

是的,有。它叫做with

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

也就是说:

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

例如:

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

【讨论】:

  • 我不熟悉,但是根据MDN:Using "with" is not recommended, and is forbidden in ECMAScript 5 strict mode.
  • 是的,with 使用严格的语言。我什至不会再提它了。
  • @WesleyMurch with(以及eval)在有意使用时很好。
  • 我只是想补充一下,因为原来的答案很简单“是的,有。它被调用了。” 我的第一个想法就是使用一个变量,也许它毕竟会是一个更好的解决方案。
  • 查看我对 Sime 的评论,了解为什么在这种情况下我实际上更喜欢使用。
【解决方案2】:

怎么样:

var Math = com.example.Math;

然后:

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

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


你可以更进一步:

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

然后:

func1( func2(...) );

【讨论】:

  • 虽然这会起作用,但我的最终目标是创建一个流畅的界面,让代码读起来就像一个人在代码之外编写它一样。所以像 sin(cos(x)) 这样的东西比 Math.sin(Math.cos(x)) 更可取,尤其是当一些操作看起来更复杂时
  • @JeffStorey 我已经更新了我的答案。一般的方法是在本地环境中创建局部变量。
【解决方案3】:

我会这样做:

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 是如何在O.prototype.circ 方法中没有Math 命名空间的情况下使用的。

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

【讨论】:

    【解决方案4】:

    一种选择是使用闭包来包装对象。它不一定消除对象本身,但它有助于提高可读性,如果您使用的是 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++; }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      相关资源
      最近更新 更多