2015-12-18 13 views
2

這是一個SSCCE。如何使JavaScript在這種情況下以更明顯的方式失敗

考慮下面的代碼:

<html> 
    <head> 
    <script type="text/javascript"> 
    window.addEventListener("load", eventWindowLoaded, false); 
    var eventWindowLoaded = function() { 
     console.log('event window loaded'); 
    }; 
    </script> 
    </head> 
    <body> 
    </body> 
</html> 

它不工作,但問題不在於如何解決它。問題是,爲什麼當eventWindowLoaded變量尚未分配時,JavaScript會失敗。在Chrome中進行調試時,控制檯上看不到任何內容,並且沒有任何跡象表明出現問題。代碼只是默默地失敗。我需要哪些選項/工具來確保在開發JavaScript的過程中失敗更爲驚人? ("use strict";也不做)。

+2

查看像eslint這樣的工具:http://eslint.org/它允許您定義規則(如*在將變量分配給*之前沒有使用變量),並且如果不遵循這些規則則會拋出錯誤。 – nils

+0

變量已經存在,因爲變量提升,所以你的代碼在技術上不包含錯誤,它什麼也不做。 – Shilly

+1

我第二次@nils的評論 - 代碼本身並沒有失敗 - 它的表現完全如寫。在開發階段使用靜態分析器而不是在運行時會發現這些問題。對於這個特定的,jslint顯示「'eventWindowLoaded'超出了範圍。」 –

回答

-2

eventWindowLoaded變量是「懸掛」的,所以當調用window.addEventListener方法時,這個方法會以「undefined」的形式傳遞。在內部,事件監聽器必須被設置爲安靜地忽略未定義或空方法。

-2

這裏沒有錯。

如果您使用函數聲明而不是函數表達式,則代碼將按預期工作。

window.addEventListener("load", eventWindowLoaded, false); 
function eventWindowLoaded() { 
    console.log('event window loaded'); 
}; 

我不會解釋,但請閱讀JavaScript提示。

函數表達式(如您的示例中)在頁面加載時不會懸掛在頂部。然而函數聲明。

截至您負載事件調用eventWindowLoaded它是不確定的時間的結果。

因此,無論使用函數的聲明或者,把你的函數表達式上述負載事件。

+0

爲什麼選擇投票? – tkiddle

+1

問題是:「我有什麼選擇/工具可以確保在開發JavaScript的過程中失敗的更爲驚人?」_你的答案只是爲什麼代碼不起作用。 –

0

正如你似乎知道吊裝(通過反對票來判斷)你知道你的代碼爲什麼不起作用。因此,爲了確保JS失敗得更加壯觀,您可以將代碼更改爲:

window.addEventListener("load", eventWindowLoaded || function(){ throw new Error('An error message' )}, false); 
+0

這個答案也是「修復代碼」,而不是展示一種方法來首先檢測代碼是否有邏輯錯誤。 –