【问题标题】:JS - ReferenceError not defined when referencing a property dynamicallyJS - 动态引用属性时未定义 ReferenceError
【发布时间】:2019-08-12 14:25:30
【问题描述】:

我正在尝试引用动态设置的变量的属性。当第一个 console.log 行与 vars[sv.name] 一起运行时,它会输出正确的结果。当我在 eval 语句中进一步引用 vars[] 时,我得到一个 ReferenceError。

vars = {};
        // Get the array of current variables 
        if (cache[msg.guild.id]) {
            cache[msg.guild.id].variables.forEach(sv => {
                if (sv.type == 'Text' || sv.type == 'Number') {
                    vars[sv.name] = sv.value;
                    console.log(vars[sv.name] + ' ' + sv.name);
                }
            });
            console.log(vars);
            Object.keys(action).forEach(e => {
                try {
                    var newVal = eval('`' + action[e] + '`');
                    action[e] = newVal;
                }
                catch(err) {
                    console.log(err);
                }
                 //console.log(`key=${e}  value=${action[e]}`)
            });
        }

我得到的错误是:“ReferenceError: c is not defined”,其中“c”是属性名称。

这是我引用的对象的样子: { c: 'ok' }

这是缓存变量中的内容:

{ 
    variables: [ { name: 'c', value: 'ok', type: 'Text' } ] 
}

在这种情况下action[e] 是:${vars[c]}

【问题讨论】:

  • 我不清楚这里的意图是什么。为什么需要eval动作的内容?你需要做的就是得到一个键的值,为什么不把"c"存入actions[e]然后做vars[action[e]]呢?或者使用标记模板或其他东西。至少可以说,当前的系统看起来很奇怪。
  • c 只是属性名称,它对应于来自用户输入的字符串。由于它来自用户输入,并且字符串中可能有任意数量的这些变量,我不能使用模板

标签: javascript node.js


【解决方案1】:

有一个沙箱可以运行“eval”代码。出于安全原因,有一个单独的范围。

【讨论】:

  • 有没有办法绕过这个?我需要在运行时动态地将值替换为字符串。
  • 实际上看起来'eval'可以访问全局范围。尝试使用全局变量。
  • 我的理解是做 vars = {} 而不是 var vars = {} 使它成为全球性的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2018-03-08
  • 1970-01-01
  • 2021-07-03
  • 2019-04-15
  • 2014-06-16
  • 1970-01-01
相关资源
最近更新 更多