在 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] );
这里是非常基础的 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] );