是否可以将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
,这将使它无需前缀,说,bar
为a.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中没有像这样的魔术(除了仅仅制作所有模块属性全局变量 - 当然不是你想要的),你将需要另一种解决方案。
将a
和b
混合成单个模块很简单,通过使用extend
方法。使用jQuery,它可能看起来像
var c = $.extend({}, a, b);
但你可以做一个简单的for-in-loop以及。你甚至可以声明它为一个自己的requirejs模块,依赖于a和b并返回c;所以你只需要请求c。
为便于发展的原因不相同的源文件中拌匀
有可能是通过使用构建工具的几个开发文件合并成一个(巨大)生产其他的可能性文件。不确定这是否适用于您的情况。
啊,有趣的 - 我会研究'延长'。至于使用构建工具,我宁愿不要。 – 2013-02-11 18:32:43
好的,使用'extend'可以在*'a'和'b'之外很好地运行代码*,但是我想要的是*'a'内部的代码*能够在没有前缀的情况下使用'b'中的东西,对于stuff *里面*'b'能够使用没有前缀的'a'中的东西。 – 2013-02-11 18:52:29
呃,只有在相同范围内才有可能。你真的应该找一个能自动合并这两个文件的工具。 – Bergi 2013-02-11 18:55:13