2009-05-28 132 views
1

我有一个问题,即一个方法获取未定义的变量错误,即使我在调用前检查变量未定义。Javascript错误与未定义的变量

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

我继续得到r未定义在idNav.js的行274上,这是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(); 

dhandler是我检查出来,似乎是不错的(没有问题)的方法之一。 我会再看一看,但请确定:

它用于处理向下箭头和输入键通过我的输入元素表导航。

+0

如果在调用r.focus()之前尝试“alert(r)”(或检查Firebug中的变量),结果如何? – 2009-05-28 14:49:11

+0

我会试着放入一个警报。它很难在Firebug中检查它,因为如果我放置一个断点,我不得不按下继续所有的时间通话不会失败。 – 2009-05-28 14:57:02

+0

萤火虫的堆栈轨迹是什么?有另外一个地方叫你忘了吗? (以及为什么不添加if(!r)返回;在setFocusFromVar() – 2009-05-28 14:58:44

回答

5

根据您的描述问题,在我看来,它有时也被称为越来越不健康检查。我会把理智检查放在函数内部而不是外部。

但是,你也可能想知道你是如何解决它的。我想修改函数如下检查什么错误在Firebug:

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

然后当你到了断点,你可以看看Firebug的堆栈跟踪,以确定你是怎么得到的功能,而不检查R是否是是否定义。

0

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

0

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

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

0

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

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

r的值取决于其声明和作用。

  • var r; =>未定义,但可测试为 null(r == null将返回true)
  • var r =“test”; =>字符串测试
  • var r = null; => null;
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(); 
}