混淆TypeError:无法读取未定义的属性'n'

混淆TypeError:无法读取未定义的属性'n'

问题描述:

在试图在字典中传递两个值的ajax调用(对于游戏)中,只有一个值似乎正在读入,而另一个值JavaScript类的实例)似乎在抛出“TypeError:无法读取未定义的属性'col'。”尽管这个调用与其他调用完全相同,但是在相同代码中可以正常工作。混淆TypeError:无法读取未定义的属性'n'

这里的,这似乎是导致问题的类:

function Cell(col, row) { 
    this.col = col; 
    this.row = row; 
    // as well as an .eq and .ne and one or two other simple methods 
} 

这里的呼叫的建立:

uCell = new Cell(-1, -1); // creates the Cell instance to pass 
var dataout = { 
    ucell:uCell, 
    boardnumber:G.BOARDNUM, 
}; 
// able to alert out both ucell and uCell values here just fine as well as boardnumber 

而这里的调用本身:

rqst_cellboard = $.ajax({ 
    type:  "POST", 
    data:  dataout, 
    url: "/project03/cellboardcall/", // this never gets called 
    dataType:"json", 
    error: // etc. 
    success: // etc. 

的在进行ajax调用之前抛出错误,显然是因为它正在建立。看一看引发错误的jQuery断点处的context对象,它看起来像data的值只有boardnumber,而不是ucell。该错误读取TypeError: Cannot read property 'col' of undefined。我无法弄清楚jQuery中的哪个参数未定义,但我假设它是ucell,因为这应该是col属性。

一切似乎都很好地进入呼叫定义,但呼叫本身越来越borked。我相信这是非常简单的,但我无法想象它。感谢任何想法。

+0

您的问题*享的代码没有问题。检查是否覆盖“uCell”。 – 2011-03-15 14:27:24

rqst_cellboard = $.ajax({ 
    type:  "POST", 
    data:  dataout, 
    url: "/project03/cellboardcall/", // this never gets called 
    dataType:"json", 
    error: // etc. 
    success: // etc. 

我敢打赌,这个问题是关系到事实“DATAOUT”不是一个格式正确的JSON对象。尤其是,它具有对uCell的引用,它本身不是JSON对象,因为你说它已经实现了方法。

JSON对象必须遵循一套相当严格的规则,就它们可以具有的属性而言。您可能需要为ajax调用创建一个新对象,该对象只包含您实际想要传输的属性。

+0

好眼睛。如果我“解压缩”uCell并单独传递col&row值(col:uCell.col,row:uCell.row),这就允许我完成ajax调用。这对代码的演化来说也是有意义的 - 在Cell()添加了实用方法之前,这些调用在这些调用中运行得更好。谢谢! – wallace 2011-03-15 15:43:07

+1

这种事情在我工作的人身上不断咬人,所以“它实际上不是一个JSON对象”在调试其他人的代码时正迅速成为我的首选想法。 – 2011-03-15 16:06:29

摆脱尾随逗号的:

boardnumber:G.BOARDNUM, // <-- evil comma 

IE是(并且一直)挑剔在对象和数组文本杂散逗号。

+0

即使没有逗号也是一样的错误:(我正在运行Chrome :)。有趣的是,删除逗号会导致它更快失败,并且不会执行'var dataout'和调用本身之间的任何代码(这只是调试警报)。这意味着它没有得到接近ajax呼叫的位置,我想。 – wallace 2011-03-15 14:13:01

+0

你说的话完全正确,但它不回答这个问题。 – 2011-03-15 14:17:40

+1

它可能不会回答这个问题,但我认为它不值得投票。摆脱明显的错误,看看它是否改变了什么?没有?至少你摆脱了不同的潜在问题来源,并且可以专注于手头的问题。 – 2011-03-15 14:31:25