是否可以扩展Javascript函数参数'属性到本地范围?

时间:2013-02-11 17:45:37

标签: javascript scope requirejs

是否可以将函数参数的属性扩展到函数的局部范围?请使用以下代码:

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中做些什么来使它不需要前缀,比如说,bara.bar

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

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

我试图完成这个的原因是我有几个文件在我看来逻辑上属于一个单独的模块但是为了方便开发,不能在同一个源文件中很好地混合 - 例如,生产代码和测试代码。

2 个答案:

答案 0 :(得分:2)

  

我试图完成此操作的原因是我有几个文件在我看来逻辑上属于一个单独的模块

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

使用a方法将bextend混合到单个模块中非常简单。使用jQuery,它看起来像

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

但您也可以使用简单的for-in-loop来完成。您甚至可以将其声明为自己的requirejs模块,具体取决于a和b并返回c;所以你只需要请求c。

  

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

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

答案 1 :(得分:0)

已经有一段时间了,但我发现了一种方法。可以使用JavaScript with关键字将对象扩展到本地范围。但是,根据MDN(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/with),不鼓励使用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})