Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中为eval指定一个值_Javascript_Variables_Eval - Fatal编程技术网

在JavaScript中为eval指定一个值

在JavaScript中为eval指定一个值,javascript,variables,eval,Javascript,Variables,Eval,非常基本的JavaScript程序员在这里 我正忙于编写一些代码,其中的变量如下所示: blocktype1; blocktype2; blocktype3; blocktype4; ... //everything between blocktype4 and blocktype70, the three dots are not actual code! blocktype70; blocktype[number] = 3; 现在我在一个函数中使用eval(),其中一个blockt

非常基本的JavaScript程序员在这里

我正忙于编写一些代码,其中的变量如下所示:

blocktype1;
blocktype2;
blocktype3;
blocktype4;
... //everything between blocktype4 and blocktype70, the three dots are not actual code!
blocktype70;
blocktype[number] = 3;   
现在我在一个函数中使用eval(),其中一个blocktype变量被赋予一个值。块类型取决于变量“number”

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

eval(“块类型”+数字)=3

我想要的是,假设“number”是27,那么我想要变量blocktype27得到一个值3。 当我检查控制台时,它显示:

ReferenceError:赋值中的左侧无效

有人能帮我吗? 我更喜欢香草JavaScript,仍然使用eval。
谢谢你抽出时间

正确的解决方案可能是找到一个最适合序列且可通过索引访问的方法

var number = 1;
var val = 3;
var blocktype = []; // so clean
blocktype[number] = val;
然而,也是如此。这假设变量在全局范围内,因此是全局(窗口)对象的属性

eval
的问题在于,它实际上与执行
f()=3
是一样的,这是没有意义的:只有变量/属性可以分配给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为勇气:作业的左侧必须是a,这是描述上述行为的一种更为冗长的方式。(JavaScript函数不可能返回RST,尽管从技术上讲,它可以用于供应商主机对象。)

请不要接受这一点,因为它没有使用
eval()
,但是:

您可以分配大小为71的数组,如下所示:

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

您现在可以指定如下元素:

blocktype1;
blocktype2;
blocktype3;
blocktype4;
... //everything between blocktype4 and blocktype70, the three dots are not actual code!
blocktype70;
blocktype[number] = 3;   
并像这样使用它们:

alert( blocktype[number] );

而不是开始使用数组。学习它们,然后远离
eval()
。同意。教一个新的开发人员如何做这件事,而不是教正确的方法,即数组,这有点适得其反。这是可能的。只是出于安全考虑,您永远不会想这样做。eval模式的风险在于“严格使用”,当其他更新工作正常时,分配给未知var会引发问题…谢谢,eval部分起到了作用,我相信其他部分也会起到作用,但我还是太傻了,不知道上面到底发生了什么。再次感谢@我建议学习如何使用数组和属性访问器。它们更干净,教授重要的基础知识,有助于避免以后出现问题。请看相关问题——除了极少数例外,eval完全是不必要和混乱的。我知道
var blocktype=[]
会更短,并且不需要调整大小,但是指出基于零的索引似乎很有用。