我正在调试一个5年多的旧剧本,这让我疯狂。我找到的答案都没有帮我查明错误。 阅读完阵列后,我已经制作了一个新版本。 无论是位置还是异常的“时间”对我来说都没有任何意义......
//NEW VERSION
tasks=[];
status=[];
function initCalendarInfo(){
for (k=0;k<40;k++) {
tasks[k] = [];
status[k] = [];
for (i=0;i<12;i++) {
tasks[k][i]= [];
//THROWS EXCEPTION IN NEXT LINE k=0,i=0,j=0
status[k][i]= [];
for (j=0;j<31;j++){
tasks[k][i][j]='';
status[k][i][j]=0;
}
}
}
}
//OLD VERSION
tasks = new Array(40);
status= new Array(40);
function initCalendarInfo(){
for (k=0;k<40;k++) {
tasks[k] = new Array(12);
status[k] = new Array(12);
for (i=0;i<12;i++) {
tasks[k][i]= new Array(31);
status[k][i]= new Array(31);
for (j=0;j<31;j++){
tasks[k][i][j]='';
//THROWS EXCEPTION IN NEXT LINE k=0,i=1,j=0
status[k][i][j]=0;
}
}
}
}
答案 0 :(得分:3)
这是避免全局变量的众多原因之一。
在浏览器上,已经有一个名为status
的全局变量,您无法更改其类型。它是一个字符串,并为其分配一个数组只会导致数组被强制转换为字符串(空白数组强制转换为空字符串)。回到当天,status
用于在浏览器的状态栏中设置文字。浏览器主要是A)不再具有永久状态栏(只是显示为叠加的状态栏),B)不允许你改变它们(因为人们过去常常显示链接的虚假版本)当真正的联系......好吧......其他事情)。
如果将整个脚本放在作用域函数中并声明变量,问题就会消失:
(function () {
//NEW VERSION
var tasks = [];
var status = [];
function initCalendarInfo() {
for (var k = 0; k < 40; k++) {
tasks[k] = [];
status[k] = [];
for (var i = 0; i < 12; i++) {
tasks[k][i] = [];
//THROWS EXCEPTION IN NEXT LINE k=0,i=0,j=0
status[k][i] = [];
for (var j = 0; j < 31; j++) {
tasks[k][i][j] = '';
status[k][i][j] = 0;
}
}
}
}
initCalendarInfo();
snippet.log(JSON.stringify(status, null, 2));
snippet.log(JSON.stringify(tasks, null, 2));
})();
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
关于声明变量:您的代码即使您将其置于作用域函数中,也会成为The Horror of Implicit Globals的牺牲品。声明变量非常重要。
答案 1 :(得分:0)
没关系好人。 &#34;状态&#34;似乎是一个保留字或引用状态栏或其他东西。刚重命名变量和瞧。无论如何,这种行为很奇怪 - 特别是对于预定义的阵列,所以任何光线都会被欣赏!