我正在尝试动态创建指向对象的node.js 变量。
我知道我可以使用 eval 在范围内动态创建变量:
var vars = ['a','b']
for(var n=0; n<vars.length; n++) {
eval('var '+vars[n]+' = '+n)
}
console.log(b) // prints 1
上面动态创建变量并给它们一个值,无论它们的索引在vars
list.
但是如果我想将这些动态变量设置为对象引用怎么办?像下面这样:
var vars = {a: {}, b:{}}
for(var k in vars) {
eval('var '+k) // create the variable dynamically
new Function('value', k+' = value')(vars[k]) // attempt to set the value
}
a.b = 5
console.log(vars.a.b) // undefined : (
我知道为什么上面的方法不起作用 - 创建的函数new Function
无法查看当前范围,因此无法设置该值。有没有办法做我想做的事情,这样console.log(vars.a.b)
会打印“5”而不是“未定义”?
UPDATE:
嗯,我错了new Function
无法查看或修改本地范围内的变量,因为这是有效的:
var obj = {}
eval('var x')
new Function('value', 'x = value')(obj)
obj.a = 5
console.log(x.a) // prints 5
所以现在我很困惑为什么我上面的循环似乎不起作用..
更新2:
我刚刚意识到我的代码实际上does在 Chrome 的控制台中工作。但它在 Node.js 中不起作用......
专为菲尔更新:
这是我的情况。我在用着朴素 https://github.com/jneen/parsimmon/blob/master/API.md构建解析器组合器。这是如何完成的:
var L = Parsimmon.createLanguage({
combinator1: function() {
return Parsimmon.string('hi')
},
combinator2: function() {
return L.combinator1.many()
}
})
我想消除编写的需要L.
在我编写的每个解析器组合器之前。我可以这样做:
var combinator2 = L.combinator2
但这需要我为我编写的每个组合器添加一行这样的附加行。如你所见,我无法使用with
since L
是在我能够写之后创建的with(L)
如果我在下面定义函数然后在对象中使用它们,那么每次编写新的组合器时我都会重复这些函数名称。
总而言之,我想循环一下L
并将所有生成的解析器组合器放入范围内一个漂亮的干净变量中,以便我可以编写combinator1
代替L.combinator1
(etc).