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

问题描述:

是否可以将函数参数的属性扩展到函数的局部范围?看看下面的代码:是否可以将Javascript函数参数的属性扩展到本地范围?

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 
}) 

我之所以试图做到这一点的是,我有一个在我看来,在逻辑上在单一模块中属于一起的几个文件,但为了方便对发展的原因并不在同一个源拌匀文件 - 例如生产代码和测试代码。

已经有一段时间了,但我发现了一种方法来做到这一点。可以使用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}) 

我对试图做到这一点的原因是,我有一个在我看来,在逻辑上与单个模块

阿中属于一起的几个文件,我们已经有了一个XY-问题:-)由于在js中没有像这样的魔术(除了仅仅制作所有模块属性全局变量 - 当然不是你想要的),你将需要另一种解决方案。

ab混合成单个模块很简单,通过使用extend方法。使用jQuery,它可能看起来像

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

但你可以做一个简单的for-in-loop以及。你甚至可以声明它为一个自己的requirejs模块,依赖于a和b并返回c;所以你只需要请求c。

为便于发展的原因不相同的源文件中拌匀

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

+0

啊,有趣的 - 我会研究'延长'。至于使用构建工具,我宁愿不要。 – 2013-02-11 18:32:43

+0

好的,使用'extend'可以在*'a'和'b'之外很好地运行代码*,但是我想要的是*'a'内部的代码*能够在没有前缀的情况下使用'b'中的东西,对于stuff *里面*'b'能够使用没有前缀的'a'中的东西。 – 2013-02-11 18:52:29

+0

呃,只有在相同范围内才有可能。你真的应该找一个能自动合并这两个文件的工具。 – Bergi 2013-02-11 18:55:13