未定义变量的Javascript错误

时间:2009-05-28 14:45:24

标签: javascript firefox

我遇到一个方法是获取未定义的变量错误的问题,即使我在调用之前检查变量是否未定义。

// Sets focus and text-select to the passed in element.
idNav.prototype.setFocusFromVar = function(r) {
    document.activeInputArea = r;   // my variable for tracking focus
    r.focus();    // error happens here (line 274 of idNav.js)
    r.select();
}

错误发生在r.focus行。

在我调用该方法的两个地方,我使用类似于以下的模式,在调用者中使用局部变量r。

if (!r)
    return;

this.setFocusFromVar(r);

然而错误仍然存​​在。当r不为null或未定义时,它是我网页上表格中的输入元素。

我继续在idNav.js的第274行(即r.focus行)上未定义r。该方法的所有调用者也在同一个js文件中。

我错过了什么?

这个错误在Firefox中间歇性地发生,我没有在IE中测试过这个特定的错误。

EDTA: r确实显示为未定义,错误的堆栈跟踪显示:

setFocusFromVar()(undefined)IDNav.js (line 275)
dhandler(Object originalEvent=Event keydown type=keydown)IDNav.js (line 100)
newTrigger()(Object originalEvent=Event keydown type=keydown)jquery.hotkeys.js (line 1)
F()()jquery.js (line 19)
F()(Object originalEvent=Event keydown type=keydown)jquery.js (line 19)
F()()jquery.js (line 19)
[Break on this error] r.focus();

dhandler是我检查过的方法之一,似乎很好(没有问题)。 不过我会再次看一下:

它用于处理向下箭头并输入用于在输入元素表中导航的键。

5 个答案:

答案 0 :(得分:5)

根据您对问题的描述,在我看来,有时在没有完整性检查的情况下调用它。我将完整性检查放在函数内部而不是在函数之外。

但是,您可能也想知道如何首先解决这个问题。我将按如下方式修改函数以检查Firebug中出现的问题:

idNav.prototype.setFocusFromVar = function(r) {
    if (!r) {
        return;  // Set the breakpoint here
    }
    document.activeInputArea = r;
    r.focus();
    r.select();
}

然后当您点击断点时,您可以查看Firebug的堆栈跟踪,以确定如何在不检查r是否已定义的情况下获取该函数。

答案 1 :(得分:2)

我建议在功能中移动(或复制)您的健全检查,如下所示:

idNav.prototype.setFocusFromVar = function(r) {
    if (!r)
        return;

    document.activeInputArea = r;   // my variable for tracking focus
    r.focus();    // error happens here (line 274 of idNav.js)
    r.select();
}

答案 2 :(得分:0)

我不确定,但不应该调用if(r == undefined)而不是if(!r)? 我总是这样做......

答案 3 :(得分:0)

您应该测试该变量不为空并且不等于undefined

这是关于Javascript中存在的测试变量的good article。它列出了各种方法,以及每种方法的优缺点。

答案 4 :(得分:0)

我很少使用if(!r)来测试变量是否未定义。

我更喜欢使用if(typeof(r)=='undefined')或if(r!= null)。

r的值取决于其声明和影响。

  • var r; =>未定义但可测试 null(r == null将返回true)
  • var r =“test”; =>字符串测试
  • var r = null; =>空;