gpt4 book ai didi

node.js - 如何在node.js的当前范围内动态创建变量?

转载 作者:太空宇宙 更新时间:2023-11-03 22:09:37 26 4
gpt4 key购买 nike

我正在尝试动态创建指向对象的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 列表中的索引如何。

但是如果我想将这些动态变量设置为对象引用怎么办?类似于以下内容:

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”而不是“未定义”?

更新:

嗯,我错了,new Function 无法查看或修改本地范围内的变量,因为这是有效的:

var obj = {}
eval('var x')
new Function('value', 'x = value')(obj)

obj.a = 5
console.log(x.a) // prints 5

所以现在我很困惑为什么我上面的循环似乎不起作用..

更新2:

我刚刚意识到我的代码实际上确实可以在 Chrome 的控制台中运行。但它在 Node.js 中不起作用...

专为菲尔更新:

这是我的情况。我正在使用Parsimmon构建解析器组合器。这是如何完成的:

var L = Parsimmon.createLanguage({
combinator1: function() {
return Parsimmon.string('hi')
},
combinator2: function() {
return L.combinator1.many()
}
})

我想消除在编写每个解析器组合器之前编写 L. 的需要。我可以这样做:

var combinator2 = L.combinator2

但这需要我为我编写的每个组合器添加一行类似的内容。如您所见,我无法使用 with 因为 L 是在我能够编写 with(L) 后创建的,并且 if我在下面定义了我的函数,然后在对象中使用它们,每次编写新的组合器时,我都会重复这些函数名称。

总而言之,我想循环 L 并将所有生成的解析器组合器放入范围内一个漂亮的干净变量中,这样我就可以编写 combinator1 而不是L.combinator1(等)。

最佳答案

IIUC,是否有更好的方法来实现你的目标,如果你只是删除 'var '关于动态Function ,它将在外部(全局)范围内运行。

更改:

new Function('value', k+' = value')(vars[k])

至:

new Function('value', k+' = value')(vars[k])

所以:

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)

您不想在函数内部声明具有局部作用域的新变量,而是希望在外部作用域上进行操作。

更新以解决新问题

你的第一个循环确实有效。尝试反省ab ;正如预期的那样,它们分别为 0 和 1。

基于 Node.js 的信息更新 2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function , Function始终在全局范围内工作。在 Node 中,它位于 globalvar变量不是全局范围,而是模块的范围。要修复 Node 的此问题,您可以执行以下操作并省略 eval var声明(对于模块来说,它覆盖了您可以在 Function 内部访问的全局范围):

var vars = {a: {}, b:{}}
for(var k in vars) {
new Function('value', k +' = value')(vars[k]) // attempt to set the value
}

a.b = 5
console.log(vars.a.b) // 5

换句话说,内部函数设置的变量可以通过global自动访问。 ,所以你的模块代码,在没有任何模块范围的 var 的情况下a的声明覆盖全局,可以设置全局a属性与 a.b = 5 行相同.

更新3

因为我刚刚解决了您的理解问题Function ,我提供了以上信息。根据您的后续评论(再次强调,没有谈到它是否适合您的特定用例),您可以通过 eval 对该对象进行操作如下:

var vars = {a: {}, b:{}}
for(var k in vars) {
eval('var '+k+' = vars["'+k+'"]')
}

a.b = 5
console.log(vars.a.b) // 5

但是重申其他人发出的警告 - 使用 eval通常这不是一个好主意,并且当引用的变量包含任意用户数据时可能会很危险......

关于node.js - 如何在node.js的当前范围内动态创建变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46440029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com