JS嚴格模式與非嚴格模式


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM