2009-05-28 134 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(); 
}