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

2024-06-25

我正在尝试动态创建指向对象的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).


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

Change:

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

to:

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

So:

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)

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

更新以解决新问题

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

更新 2 基于 Node.js 的信息

Per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function , Function始终在全球范围内工作。在 Node 中,这是开启的global and var变量不是全局范围,而是模块的范围。要修复 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.

Update 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通常这不是一个好主意,并且当引用的变量包含任意用户数据时可能会很危险......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在node.js的当前范围内动态创建变量? 的相关文章

  • Javascript 充满好奇心

    当我调用这个 Promise 时 输出与函数调用的顺序不匹配 这 then出现在 catch 即使承诺 then之后被呼叫 这是什么原因呢 const verifier a b gt new Promise resolve reject g
  • webpack用css/scss文件生成js文件

    描述 在我使用的 webpack 中迷你 CSS 提取插件 plugins new MiniCssExtractPlugin filename name hash css chunkFilename name hash css 加载 scs
  • Electron Auth0Lock“原始文件://不允许”

    尝试让 auth0 与我的电子应用程序一起使用 当我按照默认教程并尝试使用用户名 密码 身份验证进行身份验证时 锁定失败并显示 403 错误 并响应 不允许使用 Origin file 我还在 auth0 仪表板中客户端设置的允许来源 CO
  • NodeJS 和 PHP (Laravel) 集成用于 Socket.IO 实时聊天

    目前我有一个我写过的网站PHP通过Laravel 框架 我已经使用写了一个实时聊天nodeJS with 套接字IO and Express现在我想做的是将它集成到我已经编写的 Laravel 网站中 问题是聊天必须在主页中 当前由 Lar
  • Microsoft SQL 数据库的 WebSocket 侦听器

    我目前正在开发一个项目 该项目必须使用 WebSockets 作为将数据传输到客户端的方式 基础设施看起来像这样 客户端 gt Web 服务器 gt Microsoft SQL 数据库 我想最理想的情况应该是这样的 客户端打开一个到服务器的
  • Mongoose 密码哈希

    我正在寻找一种使用 mongoose 将帐户保存到 MongoDB 的好方法 我的问题是 密码是异步散列的 setter 在这里不起作用 因为它只能同步工作 我想了两种方法 创建模型的实例并将其保存在回调中 哈希函数 在 保存 上创建预挂钩
  • 如何使 Puppeteer 在客户端与 ReactJS 应用程序一起工作

    我对 React 相当陌生 我正在开发一个应用程序 它将拍摄网页的实际屏幕截图 并且该应用程序可以在所拍摄的屏幕截图上绘制和添加涂鸦 我最初使用 html2canvas 和 domToImage 来获取客户端屏幕截图 但它不会完全按照网页中
  • Aptana Studio 有 NodeJS 插件吗?

    Aptana Studio 有 NodeJS 插件吗 至少对于 NodeJS 代码辅助来说是这样 也许是创建 NodeJS 项目的一种方法 以及本地NodeJS调试 目前我们没有 NodeJS 支持 如果社区对此感兴趣 那么提交功能请求并对
  • Mongoose 填充与对象嵌套

    使用之间是否有任何性能差异 查询的处理时间 猫鼬种群 http mongoosejs com docs populate html和直接对象包含 每种应该什么时候使用 猫鼬种群示例 var personSchema Schema id Nu
  • Express + EJS - 将参数传递给 EJS 视图

    我对 Node js Express EJS 相当陌生 我最近注意到 当我将参数从 Express 请求处理程序传递到 EJS 视图并省略参数名称时 它会根据变量名称创建一个名称 例如 在下面的代码中 server js var expre
  • 为什么人们将 typescript 的类型存储为 package.json 中的依赖项(而不是 devDep)? [复制]

    这个问题在这里已经有答案了 我注意到在几乎所有关于 typescript 的教程或博客文章中 人们只是通过 npm 安装类型和 或 typescript 相关模块的软件包作为依赖项 这是与编译时相关的事情 最终用户永远不必加载它 所以对我来
  • 在express中设置静态javascript文件的内容类型

    我在用express使用 es6 模块提供带有 js 文件的页面 关于 es6 模块 https jakearchibald com 2017 es modules in browsers https jakearchibald com 2
  • NodeJS 需要全局模块/包

    我正在尝试全局安装然后使用forever and forever monitor像这样 npm install g forever forever monitor 我看到了通常的输出以及将文件复制到全局路径的操作 但是如果我尝试requir
  • 如何在没有到期时间的情况下使 JWT 令牌失效

    正在使用 JWT 创建一个 Node js 后端应用程序 对我来说 要求很简单 授权令牌不应该有任何到期时间 但是当用户更改密码时 我在使 JWT 失效期间遇到问题 当用户更改密码时 我将创建一个新的 JWT 令牌 并删除旧的令牌 但用户仍
  • Javascript:同步到异步转换器库

    1 什么是更好的streamlinejs https github com Sage streamlinejs https github com Sage streamlinejs或叙述 http www neilmix com narra
  • 页面路由不完全是我想要的

    我在下面的代码中使用 Angular Routing 将用户引导至新的注册表单 该应用程序的工作原理如下 用户看到一个网页 要求他们通过单击适当的按钮在 数字报价 或 屏幕报价 之间做出选择 单击该按钮后 它应该将其定向到另一个显示相应注册
  • 将 React 应用程序作为后台进程运行

    我对部署前端代码完全陌生 因此提出了这个问题 我有一个 React 应用程序 需要作为后台进程运行 但是我对如何执行此操作有点困惑 我运行一个 npm 脚本 npm run build 在服务器上构建 缩小和服务项目 构建过程的相关代码是这
  • 玩笑 toEqual 不适用于异常匹配

    我是新来的jest所以我不确定是否是我的错 这是我的测试用例 it should throw error if wrong email or phone number is provided async gt await expect us
  • Puppeteer - 错误:协议错误 (Network.getResponseBody):找不到具有给定标识符的资源

    我正在尝试使用此代码使用 puppeteer 从网站获取响应正文 usr bin env node require dotenv config const puppeteer require puppeteer const readline
  • 如何阻止我的 App Engine 应用程序的“appspot.com”?

    我添加了一个自定义域 并将其添加到 App Engine 例如 假设我的自定义域是 example com 我的应用程序由 Node js 提供服务 当我通过 App Engine 部署我的应用程序时 它会向我提供以下地址来访问它 exam

随机推荐