2014-02-12 44 views
2

我已經看過幾個庫,它似乎不包括在文件或功能級別的"use strict";行。因此,如果開發人員啓用嚴格模式,那麼我們如何知道庫是否兼容?當嚴格模式開啓時,可能會出現奇怪的功能或瀏覽器特定問題,這些問題不容易察覺,因此錯過了它們太遲了!我們應該使用「嚴格使用」;與第三方庫(骨幹,下劃線)?我們如何知道它們是「嚴格」兼容的?

+0

請參閱[這個問題](http://stackoverflow.com/questions/1335851/what-does-use-strict-do-in-javascript-and-what-is-the-reasoning-behind-it) – Beterraba

+0

是的,我已經看到了這個問題,但更多的是關於使用它,而不是找出一個庫是否支持嚴格模式。普遍的共識是始終使用嚴格模式,但是它不得不修復不支持它的第三方代碼而頭痛。也許這只是一個文檔問題。作者應該在他們的代碼中有一個標準,例如//支持嚴格模式。 – DynamicDan

+1

在文件中使用嚴格模式時,它僅適用於實際寫入該文件的代碼。即使它不是以嚴格模式寫入,也可以使用其他庫中的函數。 – Beterraba

回答

2

當然,"use strict"可以肯定是used at the top of a file of concatenated scripts (MDN),所以只要他們都嚴格模式的腳本,一切都將是花花公子:如果沒有或有嚴格/非嚴格腳本的混合,還有的可能性拋出的錯誤通常不會被拋出。

使用它的最簡單的方法是保持它的發展並將其排除在生產代碼中:你知道什麼事情應該做,並且能夠找到/糾正錯誤,所以任何嚴格模式錯誤都會僅用於改善您的代碼。一旦投入生產,嚴格模式確實只會爲用戶「打破」您的網站,但對他們沒有任何好處,除非他們足夠精明地調試並向您報告(不太可能)。 由於嚴格模式是javascript的一種限制形式,因此放鬆您的語法比收緊它時更不可能導致錯誤。(主要例外是eval,當嚴格模式被刪除時,它可以開始「泄漏」變量到周圍的範圍)。

除此之外,您仍然可以連接腳本,但只能將嚴格安全的腳本包裝在函數中以使用每個函數的嚴格模式。你不必做每個原子在這種情況下功能,只是包裝整個腳本(S)的功能:

(function(){ 
    "use strict" 
    // My strict-mode script or scripts 
})(); 

// non-strict safe scripts 

當你認爲你只需要做這並不是說有更多的字符它曾經可以將全部嚴格模式腳本粘貼到該函數中。

我發現,由於嚴格模式的目標是「永遠不會意外創建全局變量」,因此不得不將全局變量顯式導出函數的缺點是,我通常已經指定window我想要全局變量。

+0

我想這意味着我們不應該打擾在嚴格模式下測試第三方庫,因爲它們要麼是生產準備好,要麼不是。如果作者不使用嚴格模式,那麼修復代碼並提交補丁可能非常耗時。但是,如果您願意,您的答案確實提供了一個很好的選擇。不包括嚴格的生產模式很有意義。 – DynamicDan

+0

在嚴格模式下的一些測試可能是有用的:它會指出圖書館「偶然地」引入可能與您自己產生衝突的全局變量的情況 - 是的,我通常的做法不是等待請求,而是隻要在非嚴格模式下粘貼特定腳本,但至少可以更好地瞭解它在做什麼。 –

相關問題