开发者问题收集

我该如何解决未捕获的类型错误:无法读取我的全局变量未定义的属性“长度”?

2019-07-30
124

我复制并粘贴了以下代码到我的 chrome 浏览器控制台中。该代码应该动态生成一个表并用数组中找到的内容填充它。

虽然我的代码看起来有效,但我不断收到以下错误消息:

Uncaught TypeError: Cannot read property 'length' of undefined at :15:31

找到我的代码:

var array = [["A1", "B1", "C1"],
        ["A2", "B2", "C2"],
        ["A3", "B3", "C3"],
        ["A4", "B4", "C4"],
        ["A5", "B5", "C5"],
        ["A6", "B6", "C6"],
        ["A7", "B7", "C7"]],

table = document.getElementById("table");

for(var i = 0; i < array.length; i++);
{
   //=== Adds a new Row
   var newRow = table.insertRow(table.length);

   for(var j = 0; j < array[i].length; j++);
   {
       //=== Adds a new cell
       var cell = newRow.InsertCell(j)  ;

       //=== Adds value to the cell
       cell.innerHTML = array[i][j];
   }
}

当我单击错误消息中的: 15:31 时,它表明第二个 for(var j = 0; j < array[i].length; j++); 循环内的 array[i].length 是问题所在。

我个人对这些类型的 错误消息 的体验是,主题中的变量通常不是全局定义的。但是,我的代码表明 array 变量是全局定义的。

有人可以解释一下为什么我的全局定义 array 没有被识别为已定义并能给我一个解决方案吗?

2个回答

看来您犯了几个错误。

  1. 您在两个 for 语句后面加了分号。

    for(var i = 0; i < values.length; i++);

    for(var j = 0; j < values[i].length; j++);

  2. 您将 insertCell 函数错误地输入为 InsertCell

    var cell = newRow.InsertCell(j) ;

删除分号并更改函数名称,它应该可以正常工作。

gjzim
2019-07-30

注意你的分号。参见:

var array = [1, 2, 3, 4];

for(var i = 0; i < array.length; i++)
{
  console.log(i);
}

当你在 for 语句末尾放置一个分号时,你实际上是在创建一个没有主体和阻塞范围的 for

var array = [1, 2, 3, 4];

for(var i = 0; i < array.length; i++); // it will just increment i until i >= array.length
{
  console.log(i); // 4
  // if you array[i] will get undefined, that's what you getting
  // undefined.length will throw an error
}
guijob
2019-07-30