2012-04-11 25 views
14

「嚴格使用」;看起來很棒,我們真的很想在我們的商店使用它。但是,我們只是想讓它(開發人員)能夠找到嚴格的問題;我們非常不希望在我們的實際客戶以前工作正常時讓我們的網站中斷。Live網站是否「嚴格使用」安全?

現在,我們可以只使用一些服務器端邏輯來實現這一目標:

{% if debug %}<script>"use strict";</script>{% endif %} 

......除了「使用嚴格」的動作上的一個文件,通過文件的基礎上,這樣就不會實際上工作(當然,除非我們開始服務器端處理我們所有的JS文件)。

所以,我的問題是:做所有的事情「使用嚴格的」檢查獲取頁面加載時檢查,或者是否有可能在頁面加載後使用「strict strict」來查找錯誤?如果是前者,我們可以使用「嚴格使用」,不要擔心,因爲我們會在實時加載我們的網站之前加載我們的網站。但是,如果它是後者,我們看起來運氣不佳,因爲我們無法測試每個可能的運行時情況(並且再次,我們不希望在之前沒有錯誤時爲我們的用戶犯錯誤)。

+1

您還可以在最終開發階段使用良好的JSLint,以確保代碼安全。 – jfriend00 2012-04-11 23:57:05

回答

12

這是後者。在strict mode中,Javascript解釋器可能會在運行時拋出錯誤消息,而不會以非嚴格模式拋出。

另一方面,這些錯誤大部分都是「很好的錯誤」,這意味着它們實際上不會破壞你的代碼。

例如

function foo() { 
    "use strict"; 
    bar = true; 
} 

foo(); 

這將在嚴格的模式,這是一個很好的東西

"ReferenceError: assignment to undeclared variable bar" 

。在非嚴格模式下,我們只會創建一個名爲bar的全局變量,這可能不是我們想要的。有很多其他情況,strict mode阻止程序員做一些愚蠢的/壞的/不需要的,並拋出錯誤消息。但是,再次,你想要有這些錯誤,而不是一些奇怪的錯誤。

曾經作過MDN

+2

首先,謝謝你的回答;它完全解釋了一些事情(它看起來像我只是運氣不好)。有一點:你一直說嚴格的錯誤是「*好*」,但「好」是非常主觀的。雖然我同意全局變量是不好的,但我看到它有一個以前工作正常的頁面突然停止爲客戶工作的方式是更糟糕的。嚴格性錯誤只有在防止客戶錯誤時纔是「良好」的;如果他們造成這樣的錯誤,那麼他們就比沒有嚴格(假設你的最終目標是爲你的客戶提供工作站點,而不僅僅是抽象的「完美」代碼)。 – machineghost 2012-04-12 00:52:24

+1

就像我提到的那樣。嚴格的模式會阻止你做最後最後更糟的事情,甚至可能是隱藏的錯誤。所以我總是希望得到一個明確的錯誤而不是錯誤的錯誤。 – jAndy 2012-04-12 10:45:00

6

進一步閱讀如果我理解正確的話,是的,這是絕對有可能的頁面加載後嚴格模式下捕捉錯誤。例如:

'use strict'; 

setTimeout(function() { 
    undefined = 42; // Causes a TypeError 
}, 1000); 

// Click here for a demo.

你可以做的是非常簡單的:你應該當你移動到生產反正涅槃你的JavaScript。只要確保在縮小過程中'use strict'被刪除。

如果失敗了,只要確保你的代碼是嚴格無錯的。嚴格模式通常在語義方面發揮作用,而不是因爲用戶輸入或甚至語法的原因。抓住所有案件不應該太難。 (但是縮小和刪除'use strict'是一個更好的解決方案。)

相關問題