是否可以扩展Javascript函数参数'属性转换为本地范围

Is it possible to extend Javascript function arguments' properties into local scope?

本文关键字:转换 属性 范围 扩展 Javascript 参数 函数 是否      更新时间:2023-09-26

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

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中我能做些什么,使其不必将bar前缀为a.bar吗?

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

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

我尝试实现这一点的原因是,在我看来,我有几个文件在逻辑上属于一个模块,但出于开发方便的原因,它们不能很好地混合在同一个源文件中,例如生产代码和测试代码。

我尝试实现这一点的原因是,在我看来,我有几个文件在逻辑上属于一个单一的模块

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

使用extend方法将ab混合到单个模块中是简单的。使用jQuery,它可能看起来像

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

但是你也可以用一个简单的for in循环来实现。您甚至可能将其声明为自己的requirejs模块,这取决于a和b并返回c;所以你只需要请求c.

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

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

这已经有一段时间了,但我发现了一种方法。可以使用JavaScriptwith关键字将对象扩展到本地范围。然而,根据MDN的说法,不鼓励使用with(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})