我已经解决了这个问题的“方法”,所以这并不紧急,但“为什么”让我烦恼!
我正在创建一个大约500个测试项目的银行,用于为泰国国家英语测试(ONET)进行模拟练习测试。每个项目都被声明为包含html,answer键等的对象。
然后将所有项目放入一个洗牌的数组中,第一个 n 项目成为模拟测试。
到目前为止,我已经使用了一个单独的js文件来创建问题对象,但是创建数组问题的代码仍保留在我的主js文件中。但是,今天我意识到,如果我将此数组声明转移到我的辅助页面,那么当我添加项目时,我只需要更新运行此应用程序的计算机上的辅助页面。 (由于互联网连接不佳,这主要是作为一个独立的离线电子应用程序运行。)
所以我将主页中的数组声明替换为我的辅助js页面的顶部,如下所示:
var onet_full_array = new Array(cloze005, pass002, pass007, single001,
single002, single003, single004, single005); //abbreviated
但是,当我尝试访问该数组时,元素显示为undefined。在尝试了其他几件事之后,我终于尝试将数组声明放在页面的底部之后,在对象声明之后它才有效。
困扰我的是为什么这是必要的。如果范围正确,我们似乎经常引用可能出现在页面任何位置的变量,函数等。我本以为浏览器会在决定找不到我的对象之前读取整个页面。毕竟,当我的数组声明在不同的页面上时,它没有抱怨。
我错过了什么?
编辑:为了清楚起见,我在评论中指出的遗漏的是我的原始数组声明是在设置期间未运行的函数内部。因此,在运行该函数时,声明了 对象。
答案 0 :(得分:1)
new Array(cloze005, pass002, ..)
这是创建一个新数组,并尝试将{{>} cloze005
的值放入其中。如果尚未定义cloze005
/尚未指定值,则无法在数组中放置任何值。在将放入数组之后,您无法为之后的变量赋值,并且期望该值也可以追溯地放置在数组中。代码不会以随机顺序执行,任何事情都可以随时执行。
答案 1 :(得分:0)
您似乎期望变量像指针一样运行。您的数组包含值,而不是引用。无论数组创建时的值是什么,都是剩下的值。
我认为演示有助于澄清不仅仅是单词。请考虑以下代码。在单击►运行代码段之前,请考虑您希望记录的内容。
var a = [x];
var x = 0;
var b = [x];
x = 1;
var c = [x];
log(a);
log(b);
log(c);
function log(val) { document.write("<pre>[ " + val[0] + " ]</pre>"); }
根据您的问题,您似乎希望看到:
[ 1 ]
[ 1 ]
[ 1 ]
你没有看到这个,因为,不是包含对x
的类似指针的引用,而是通过评估x
的值并存储该值来创建数组。