摘要:什么是嚴格模式嚴格模式是中引入的一種將更好的錯誤檢查引入代碼中的方法現在已經被大多瀏覽器實現顧名思義,這種模式使得在更嚴格的條件下運行因此在嚴格模式下我們的一些不嚴謹的寫法將會導致程序拋出錯誤例如在嚴格模式下該行將會拋出錯誤在上面的代碼中由
什么是嚴格模式?
嚴格模式 是 ECMAScript 5 中引入的一種將更好的錯誤檢查引入代碼中的方法, 現在已經被大多瀏覽器實現. 顧名思義,這種模式使得Javascript在更嚴格的條件下運行.
因此, 在嚴格模式下, 我們的一些不嚴謹的寫法將會導致程序拋出錯誤. 例如:
function fn(param) { var arguments = []; // 在嚴格模式下該行將會拋出錯誤: error: redefinition of arguments }
在上面的代碼中, 由于 arguments 在 js 中是一個特殊對象, 在嚴格模式下是不允許被重新定義的. 但是沒有實現嚴格模式檢查的環境中會接受這段代碼.
為什么會出現嚴格模式?總所周知, 從 ECMAscript 從1997年正式成為國際標準以來, 已經發布了6個版本. 除此之外, 還存在一些 Javascript 實現支持非標準特性, 而其他的 Javascript 實現卻并不支持這些特性的情況. 由于 Javascript 的實現多樣化, 我們很難確定哪些特性在哪些平臺上是支持的, 再加上 Web 瀏覽器的復雜性, 并且它并不能讓開發者指定某一個特定的 Javascript 版本來執行我們的程序. 因此我們需要精心的編寫程序, 以確保在所有的平臺上都能夠正常運行.
因此在 ES5 中引入了一種版本控制的考量: 嚴格模式. 此特性允許開發者選擇在受限制的 Javascript 版本中禁止使用一些 Javascript 語言中問題較多或是易于出錯的特性.
由于其語法強大的向后兼容特性, 所以即使在沒有實現嚴格模式檢查的環境中, 你的嚴格代碼仍然可以正常執行.
如何使用嚴格模式?在程序中使用嚴格模式的方式是在程序中的最開始增加一個特定的字符串字面量.
"use strict"
如果你在一個文件的頂部加入這個特定的字符串, 則表示該文件的所有內容將始終使用嚴格模式執行.
如果你只想在一個函數體內使用嚴格模式, 則在該函數體內的最開始處(頂部)加入這句指令.
為什么要使用字符串字面量來實現嚴格模式?多帶帶使用一個特定的字符串字面量來作為指令語法在語言里看起來確實相當怪異, 但是他有一個最大的好處是向后兼容. 我們來看一下它為什么能夠向后兼容. 我們都知道在js 中解釋執行一個字符串字面量是沒有任何副作用的, 這句話什么意思呢? 比如說你在 chrome 瀏覽器控制臺里面輸入一個字符串字面量, 解釋器只會返回一個同樣的字符串, 除此之外不會發生任何事情, 這就使得即使ES3引擎不支持嚴格模式, 但依然能夠無傷大雅的解釋和執行這條指令. ES3 引擎在解析完改字符串之后, 會立即將該值丟棄. 因此, 盡管舊的引擎不支持嚴格模式, 但依然能夠正常運行.
但需要注意的是: 盡管不會拋出錯誤, 但是舊的引擎不會進行任何的嚴格檢查模式, 因此如果要使用嚴格模式, 你應該總是在完全兼容ES5的環境中測試嚴格代碼.
使用嚴格模式需要注意哪些問題?我們在上面已經說過, use strict 指令需要寫在腳本或者函數的頂部, 因為該指令只有在寫在頂部才能生效. 這就使得我們在使用的時候需要注意一下這里有個小坑. 這個坑是什么呢?
舉個例子, 我們在開發大型功能的時候, 開發過程中會使用多個獨立的腳本文件, 但是在部署到生產環境的時候出于性能優化的目的, 需要將多個腳本連接成一個單一的文件. 比如說, 腳本1 運行于嚴格模式下,
// file1.js "use strict" function doSth() { }
但是有另外一個同事寫了一個腳本2運行于非嚴格模式下:
// file2.js function doOtherSth(param) { var arguments = []; }
那么, 我們該怎么連接這兩個文件呢? 如果我們以 file1.js 開始, 那么連接后的代碼將運行于嚴格模式下, 但是由于 file2 中的一些操作會在嚴格模式下拋出錯誤, 導致我們的程序無法正常運行.如果我們以 file2.js 開始, 那么連接后的代碼將運行于非嚴格模式下, 因為我們前面已經講過該指令只有在寫在頂部才能生效. 似乎怎樣都不太合適.
那么如何解決這個問題呢?
在項目中堅持只使用嚴格模式或者只使用非嚴格模式, 并且不要將使用嚴格模式和不使用嚴格模式的文件進行打包構建. O(∩_∩)O哈哈~這樣就不會有問題了嘛.
我們上面說過, 如果你只想在一個函數體內使用嚴格模式, 則在該函數體內的最開始處(頂部)加入這句指令. 我們可以利用這個特性, 將每一個腳本文件里面的代碼包裹在一個立即執行的函數表達式內, 這樣即使兩種模式的文件打包在一起, 依然能夠按照我們的期望進行工作. 例如:
;(function() { // file1.js "use strict" function doSth() { } })(); ;(function() { // file2.js function doOtherSth() { } })();
當然了, 上面這樣的做法會導致這些文件的內容不會在全局作用域內解釋, 這就導致我們通過 var 和 function 聲明的變量不會視為全局變量. 不過這剛好對我們來說也是一個很好的特性. 因此就放心大膽的使用吧, 去吧, 皮卡丘.
最佳實踐上面的方法2看起來是極好的, 并且我們可以通過自動化構建工具為我們的腳本文件上添加如上代碼. 但是如果我們想要編寫一個通用的庫, 使其可以在盡可能多的環境中正常工作, 我們不能假設腳本文件一定會被構建工具置于一個立即執行的函數中, 也不能假設客戶端代碼一定處于嚴格模式或是非嚴格模式中. 所以為了獲得最佳效果, 我們應該總是在嚴格模式下編寫代碼, 并顯式的將其包裹在啟用了嚴格模式的立即執行函數中, 而不是依靠構建工具來實現.
結語"嚴格模式"體現了Javascript更合理、更安全、更嚴謹的發展方向. 為了達到更為普遍的兼容性, 我們應該總是在嚴格模式下編寫代碼.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78736.html
嚴格模式 首先來了解一下嚴格模式是什么?嚴格模式是JavaScript中的一種限制性更強的變種方式,不是一個子集:它在語義上與正常代碼有明顯的差異,不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式,嚴格模式可以與非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式 嚴格模式的目的 首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯...
摘要:但是在以來,在面向對象中,為方法帶來了類型約束,然而這些都非常的雞肋,從文檔上可以看到。支持對象接口支持數組支持匿名函數類型約束不能用于標量類型如或。它的運作方式,是在中設置一個標志位,讓函數調用和返回類型檢查符合類型約束。 起點 眾所周知,PHP 是弱類型語言,與其他強類型語言項目,在這方面會有很多的坑,但是已經發展到 PHP 7 之后,PHP 也對類型約束有了所指,并且在許多流行框...
摘要:系列系列列表從看一與箭頭函數從看二函數傳參模式與的上一篇說到,對做了以下限定。是另外一個變量,指向不同的值,而這兩個值有相同的類型。函數中,和指向同一個值,更改的就等于更改了的。可以用改進問題是這個在嚴格模式下不能運行。 系列 系列列表:從use strict看JS(一):this與箭頭函數從use strict看JS(二):函數傳參模式與arguments use strict 的 ...
摘要:握手過程中使用了的標志和。接收端收到后,回傳一個帶有標志的數據包以示傳達確認信息。第四次揮手主動關閉方收到后,發送一個給被動關閉方,確認序號為收到序號,至此,完成四次揮手。其次,通過使和系統綁定來降低泄露后的危險。 一些開放性題目 1.自我介紹:除了基本個人信息以外,面試官更想聽的是你與眾不同的地方和你的優勢。 2.項目介紹 3.如何看待前端開發? 4.平時是如何學習前端開發的? 5....
摘要:閉包閉包是指有權訪問另一個函數作用域中的變量的函數當某個函數被調用時,會創建一個執行環境及相應的作用域鏈。要注意通過第句聲明的這個方法屬于構造函數生成的對象,而不屬于構造函數的變量對象,也就是說,并不存在于作用域鏈中。 看到評論里有仁兄建議我試試箭頭函數,真是受寵若驚,本來寫這篇文章也只是想記錄寫要點給自己日后看的。今天早上看到一篇總結javascript中this的文章JavaScr...
閱讀 3070·2023-04-25 16:50
閱讀 904·2021-11-25 09:43
閱讀 3512·2021-09-26 10:11
閱讀 2518·2019-08-26 13:28
閱讀 2531·2019-08-26 13:23
閱讀 2419·2019-08-26 11:53
閱讀 3566·2019-08-23 18:19
閱讀 2987·2019-08-23 16:27