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