BUT這種寫法存在天然的坑,假如我們要做代碼合并,我現(xiàn)在要把heigui.js:
和reeoo.js進行合并,本來兩個腳本分開執(zhí)行是好好的,合起來就會報錯。
Uncaught ReferenceError: heigui is not defined(…)
一個嚴格模式的腳本和一個非嚴格模式的腳本合并可能會導致非嚴格模式的腳本代碼報錯,建議代碼都包在一個立即執(zhí)行函數(shù)里面。
這樣合并之后就不會報錯了。
為某個函數(shù)啟用嚴格模式
要給某個函數(shù)開啟嚴格模式,得把"use strict"; 聲明放在函數(shù)體所有語句之前就行了。
Chrome中調(diào)試嚴格模式
我有這么一段代碼:
把這段代碼直接粘貼到Chrome的控制臺中執(zhí)行,正常情況下應該報錯,但是并沒有報錯,
很顯然,嚴格模式下變量不適用var聲明是不合法的,但是為什么沒有報錯?
這是什么鬼,難道Chrome不支持嚴格模式?開什么玩笑。。
網(wǎng)上搜了一下,原來Chrome的控制臺的代碼是運行在eval之中的,你沒法對eval函數(shù)使用嚴格模式(應該也不完全對,但是具體Chrome做了什么,不得而知),下圖說明eval函數(shù)可以使用嚴格模式:
要想在Chrome瀏覽器中對嚴格模式正常報錯,需要在代碼外層套一個立即執(zhí)行函數(shù),或者其它類似的措施。
這樣就可以了
FireFox代碼草稿紙調(diào)試嚴格模式
Chrome非要我們包一層閉包才能跑嚴格模式,既然這么麻煩,有沒有別的方式可以直接跑嚴格模式的代碼呢?
FireFox有一個代碼草稿紙可以直接跑,快捷鍵SHIFT+F4
嚴格模式到底有多嚴格
嚴格模式中一些重要的限制
1、變量聲明
不允許使用一個沒有聲明的變量
報錯(代碼草稿紙,下同)
Exception: ReferenceError: assignment to undeclared variable name
2、修改只讀屬性的值
嚴格模式下會報錯:
Uncaught TypeError: Cannot assign to read only property 'prop1' of #
3、修改不可擴展的屬性
表現(xiàn)為將屬性添加到 extensible 屬性設置為 false 的對象。
嚴格模式報錯:
Uncaught TypeError: Can't add property name, object is not extensible
非嚴格模式不會報錯,但是testObj也不會被擴展。
4、刪除變量、函數(shù)或參數(shù)
刪除 configurable 特性設置為 false 的屬性。
報錯:
Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
5、在一個對象文本中多次定義某個屬性
嚴格模式下不允許一個屬性有多個定義
報錯(node控制臺)
Duplicate data property in object literal not allowed in strict mode
正常模式中后聲明的重復的變量會覆蓋前面聲明的,而且不會報錯。
注:這個問題在ECMAScript6中已被修復。
6、嚴格模式下不允許形參參數(shù)名稱重復
報錯:
Uncaught SyntaxError: Duplicate parameter name not allowed in this context
7、無法使用標識符的未來保留字。嚴格模式下將保留標識符名稱
一下標識符(ES6中依然沒有實現(xiàn)的)在嚴格模式中是不能使用的,否則也會報錯。
用了就是這個下場:
Uncaught SyntaxError: Unexpected strict mode reserved word
8、嚴格模式下不允許使用八進制數(shù)字參數(shù)和轉(zhuǎn)義字符
報錯:
Uncaught SyntaxError: Unexpected token ILLEGAL(…)
9、當this 的值為 null 或 undefined 時,該值不會轉(zhuǎn)換為全局對象
比如:
在非嚴格模式下,testvar 的值為全局對象window,但在嚴格模式下,該值為 undefined。
10、字符串"eval"不能用作標識符(變量或函數(shù)名、參數(shù)名等)
Uncaught SyntaxError: Unexpected eval or arguments in strict mode
11、在嚴格模式下,函數(shù)聲明無法嵌套在語句或塊中。它們只能顯示在頂級或直接顯示在函數(shù)體中
node控制臺:
SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.
但是這個限制已經(jīng)在ES6中被修復
12、嚴格模式下eval用法無效
如果在 eval 函數(shù)內(nèi)聲明變量,則不能在此函數(shù)外部使用該變量。
Uncaught ReferenceError: testvar is not defined
13、嚴格模式下"arguments"用法無效
字符串”arguments”不能用作標識符(變量或函數(shù)名、參數(shù)名等)。
Uncaught SyntaxError: Unexpected eval or arguments in strict mode
這個跟上面第10條的限制是差不多的。
14、函數(shù)內(nèi)的 arguments,無法更改arguments 對象的成員的值
在非嚴格模式下,可以通過更改 arguments[0] 的值來更改 oneArg 參數(shù)的值,從而使 oneArg 和 arguments[0] 的值都為 20。在嚴格模式下,更改 arguments[0] 的值不會影響 oneArg 的值,因為 arguments 對象只是一個本地副本。
15、不允許使用arguments.callee
用了的下場就是這樣:
Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
16、不允許使用with
Uncaught SyntaxError: Strict mode code may not include a with statement
為什么要使用嚴格模式
既然這種模式這么多限制,我為什么還要用呢?閑得蛋疼嗎?當然8是,
JavaScript作為一門一開始用于瀏覽器的腳本語言,容錯性非常好,即使有時候你的代碼寫的不標準,也不會報錯,但這有時候會變成代碼隱患。開啟了嚴格模式之后,JavaScript的一些不合理的不嚴謹?shù)恼Z法都會得到控制,讓你能夠更嚴謹?shù)臅鴮慗avaScript代碼,成為一個更好的程序員。嚴格模式是ES5時代的產(chǎn)物,ES2015已經(jīng)在普及的路上,是時候使用嚴格模式了!
原文:http://reeoo.me/archives/strictmode.html
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com