1

是否可以将函数参数的属性扩展到函数的本地范围?采取以下代码:

function foo(a, b) {
  // apply some magic here to extend arguments' properties into local scope
  assert(bar == 'hello')
  assert(baz == 'world')
  assert(qux == 1234)
}

foo({bar: 'hello', baz: 'world'}, {qux: 1234})

假设我无法控制如何foo被调用并且我只能控制它的实现,有没有什么我可以做的事情foo使得不需要前缀,比如baras a.bar

我意识到在这样一个人为的例子中这可能看起来很疯狂,所以让我解释一下我的总体目标。我想以这样的方式使用requirejs,我不必在导入模块的成员前面加上模块名称。例如:

requirejs(['mod'], function(mod) {
  assert(mod.blah()) // OK, normal
  assert(blah())     // needs magic to work
})

我尝试完成此操作的原因是,我认为我有几个文件在逻辑上属于一个模块,但出于开发方便的原因,不能很好地混合在同一个源文件中——例如,生产代码和测试代码。

4

2 回答 2

2

我试图做到这一点的原因是我有几个文件在我看来逻辑上属于一个模块

啊,我们遇到了一个 XY 问题 :-) 由于在 js 中没有这样的魔法(除了让所有模块属性成为全局变量——当然不是你想要的),你将需要另一个解决方案。

通过使用一种方法a,将其混合b到单个模块中很简单。extend使用 jQuery,它可能看起来像

var c = $.extend({}, a, b);

但是你也可以用一个简单的 for-in-loop 来做到这一点。你甚至可以将它声明为一个自己的 requirejs 模块,这取决于 a 和 b 并返回 c;所以你只需要请求c。

出于方便开发的原因,不要在同一个源文件中很好地混合

通过使用将多个开发文件组合成一个(巨大的)生产文件的构建工具,可能还有其他可能性。不确定这是否适用于您的情况。

于 2013-02-11T18:21:34.523 回答
0

已经有一段时间了,但我发现了一种方法来做到这一点。with可以使用 JavaScript关键字将对象扩展到本地范围。但是,with根据 MDN ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/with ),不鼓励使用。但是,如果一个人真的想扩展本地范围,这就是它的样子。

function foo(a, b) {
  with (a) {
    with(b) {
      assert(bar == 'hello')
      assert(baz == 'world')
      assert(qux == 1234)
    }
  }
}

foo({bar: 'hello', baz: 'world'}, {qux: 1234})
于 2013-03-09T00:21:28.650 回答