1、使用
嚴格模式的使用很簡單,只有在代碼首部加入字符串 "use strict"。必須在首部即首部指其前面沒有任何有效js代碼除注釋,否則無效
2、注意事項
(1)不使用var聲明變量嚴格模式中將不通過,在循環中如果沒有聲明變量在非嚴格模式中很危險,i 會不小心溢出成為全局變量,但在嚴格模式中會報錯,嚴格模式中變量必須顯示聲明(var/let/const)
(2)JS中作用域有兩種,全局作用域和函數作用域。嚴格模式帶來了第三種作用域:eval作用域,則任何使用'eval'的操作都會被禁止,(eval() 函數可計算某個字符串,並執行其中的的 JavaScript 代碼,不常用容易報錯),在嚴格模式下,arguments和eval是關鍵字,不能被修改,不能做變量處理
(3)with()被禁用:with 語句用於設置代碼在特定對象中的作用域。with 語句是運行緩慢的代碼塊,尤其是在已設置了屬性值時。大多數情況下,如果可能,最好避免使用它。
(4)caller/callee 被禁用
(5)對禁止擴展的對象添加新屬性會報錯:Object.preventExtensions(obj);然后對obj增加屬性則會報錯
(6)刪除系統內置的屬性會報錯
(7)delete使用var聲明的變量或掛在window上的變量報錯
(8)delete不可刪除屬性(isSealed或isFrozen)的對象時報錯(Object.isSealed() 方法判斷一個對象是否被密封。Object.isFrozen()方法判斷一個對象是否被凍結。)
(9)對一個對象的只讀屬性進行賦值將報錯(Object.defineProperty(obj, 'a', {value: 1, writable: false})然后對obj屬性修改則會報錯)
(10)對象有重名的屬性將報錯
(11)函數有重名的參數將報錯,在嚴格模式下,函數的形參也不可以同名
(12)八進制表示法被禁用
(13)arguments嚴格定義為參數,不再與形參綁定
(14)一般函數聲明都在最頂層,ES5前的JS寬松,你可以寫在if或for內(強烈鄙視這種寫法)。當然Firefox的解析方式與其他瀏覽器不同,而在嚴格模式中這些寫法將直接報錯
(15)ES6里新增的關鍵字不能當做變量標示符使用,如implements, interface, let, package, private, protected, public, static, yield
(16)call/apply的第一個參數直接傳入不包裝為對象
(17)call/apply/bind的第一個參數為null/undefined時,this為null/undefined