在 JavaScript 中给 eval 一个值

Give eval a value in JavaScript

这里是非常基础的 JavaScript 程序员!

我正忙于编写一些带有如下变量的代码:

blocktype1;
blocktype2;
blocktype3;
blocktype4;
... //everything between blocktype4 and blocktype70, the three dots are not actual code!
blocktype70;

现在我在一个函数中使用 eval() ,其中一个值被赋予了一个块类型变量。块类型取决于变量 "number".

这就是我对那部分的看法:

eval("blocktype" + number) = 3

我想要的是,假设"number"是27,那么我希望变量blocktype27的值是3。 当我检查控制台时,它显示:

ReferenceError: Invalid left-hand side in assignment

谁能帮帮我? 我更喜欢 vanilla JavaScript 并且仍然使用 eval。 感谢您的宝贵时间!

'correct' 解决方案可能是 use an Array,这是序列的理想选择,可以通过索引访问。

var number = 1;
var val = 3;
var blocktype = []; // so clean
blocktype[number] = val;

不过,properties can be accessed as with the bracket notation也是如此。这假设变量在全局范围内,因此是全局 (window) 对象的属性。

var blocktype1;    // .. etc
window["blocktype" + number] = val;

eval 的问题在于它实际上与 f() = 3 相同,但没有意义:只能将 variables/properties 分配给 1.

但是 eval 是一个内置函数,根据错误消息,函数 的结果不能 分配给。 可以写成

var blocktype1;    // .. etc (see dandavis' comment)
eval("blocktype" + number + " = " + val);
// What is actually eval'd is:
// eval("blocktype1 = 3")

这很快就暴露了 eval 的缺陷。如果 val 是字符串 "Hello world!" 将导致 eval("blocktype1 = Hello world!") 这显然是无效的。


1 对于坚韧不拔的:赋值的左侧必须是 Reference Specification Type,这是描述上述行为的更冗长的方式。 (JavaScript 函数不可能 return RST,尽管它 在技术上可以 为供应商主机对象完成。)

尽管不接受这个,因为它特别不是使用eval(),但是:

您可以像这样分配一个大小为 71 的数组:

var blocktype = new Array(71);

(您的 number 值显然从 1 开始,因此我们必须忽略第一个元素 blocktype[0],并为 blocktype[70] 留出空间, 71)

您现在可以像这样分配元素:

blocktype[number] = 3;   

并像这样使用它们:

alert( blocktype[number] );