我的Google Chrome JavaScript控制台中有“未捕获的TypeError:undefined不是函数”

时间:2014-04-18 22:45:28

标签: javascript

所以我理解上面的错误意味着我的浏览器没有识别我试图调用的函数。我的问题是为什么在我的特定情况下发生这种情况。我会发布相关代码,也许你们可以帮助我。

我有一个功能

function homepage_screensaver()
{
    // ... bunch of lines here .... 
    var circwrapper = new Array(mycirc, theta);
    document.setInterval(move_obj(circwrapper, papwidth, papheight), 100);
}

正如您所看到的那样,调用我正在构建的另一个函数:

function move_obj(obwrap, bckwid, bckht)
{
     var c = obwrap[1]; 
     var t = obwrap[2]; 
     var bb = c.getBBox(); 
     // ... bunch of lines here ...      
}

我得到的错误在var bb = c.getBBox();行。

我有预感。我认为这个问题与我试图将一个对象包装在一个数组中然后打开它并在其上调用一个函数有关。也许浏览器无法找到对象的成员函数,因为它首先不知道它是什么类型的对象。

(我知道我创建了一个包装类在功能上没用,但这是为了我自己的可读性。)

无论如何,这里有什么解决方案?

1 个答案:

答案 0 :(得分:2)

您的问题很简单obwrap[1](函数外theta)没有getBBox属性。您可能打算访问obwrap[0]mycirc)。此外,您的数组没有索引2,因此以下行可能会更改为obwrap[1]

然而,一旦你解决了这个问题,你的代码会立即在另一个地方出现另一个问题:

当前编写代码的方式,setInterval将尝试调用move_obj(circwrapper, papwidth, papheight)返回的结果。您的代码与:

相同
var result_of_move_obj = move_obj(circwrapper, papwidth, papheight);
setInterval(result_of_move_obj, 100);

请注意,move_obj只会被调用一次,然后会定期调用move_obj结果

如果move_obj函数以return undefined;结尾(或者没有return语句,这是相同的事情),那么setInterval将尝试调用{{1}这显然不会起作用。

相反,您希望将您的调用包装在匿名函数中:

undefined