代码之家  ›  专栏  ›  技术社区  ›  Tony Peterson

未定义变量的javascript错误

  •  1
  • Tony Peterson  · 技术社区  · 16 年前

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

    // 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不为空或未定义时,它是我网页上表中的一个输入元素。

    我继续在idnav.js的第274行得到r未定义,这是r.focus行。方法的所有调用方也在同一个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();
    

    达德勒是我检查过的方法之一,看起来不错(没有问题)。 不过,我会再看一看,以确定:

    它用于处理向下箭头和输入键,以便在输入元素表中导航。

    5 回复  |  直到 16 年前
        1
  •  5
  •   Dan Lew    16 年前

    根据你对这个问题的描述,在我看来,它有时会在没有健全检查的情况下被调用。我会将健全性检查放在函数内部而不是外部。

    然而,你也可能想知道你是如何绕过它的第一位。我将修改以下函数来检查Firebug中的问题:

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

    然后,当您到达断点时,您可以查看Firebug的堆栈跟踪,以确定如何获得函数,而无需检查是否定义了R。

        2
  •  2
  •   Jonathan Fingland    16 年前

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

    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();
    }
    
        3
  •  0
  •   Fortega    16 年前

    我不是舒尔,但你不应该打if(r==未定义)而不是if(!R)? 我总是这样做…

        4
  •  0
  •   Cerebrus    16 年前

    应测试变量是否不为空且不等于 undefined .

    这里有一个 good article 测试变量是否存在于javascript中。它列出了各种方法以及每种方法的优缺点。

        5
  •  0
  •   dweeves    16 年前

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

    我更喜欢使用if(typeof(r)='未定义')或if(r!= NULL)。

    r的值取决于它的声明和矫揉造作。

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