您好,登錄后才能下訂單哦!
嚴格模式的優缺點
優點:
缺點
嚴格模式與非嚴格模式的區別
1.禁用with語法,使用將報錯
因為解析with語法時作用域的情況會非常復雜,嚴重影響代碼的解析與運行速度
function usualMode() { with({a: 1}) { console.log(a) } } usalMode() // 正常輸出 1 function strictMode() { 'use strict' with({a: 1}) { console.log(a) } } strictMode() // 將報錯
2.禁止刪除變量與函數
function usualMode() { function fn() {} var a = 1 delete a // 不會報錯,但實際上也沒能刪除變量a delete fn // 同delete a } usalMode() // 正常執行 function strictMode() { 'use strict' function fn() {} var a = 1 delete a } strictMode() // 將報錯
3.屬性描述符(propertyDescriptor)相關
能改變屬性描述符的方法有Object.defineProperty、Object.defineProperties、Reflect.defineProperty、Reflect.defineProperties、Object.freeze、Object.seal;獲取一個屬性描述符可以用Object.getOwnPropertyDescriptor、Object.getOwnPropertyDecriptors,ES6中還有Reflect.getOwnPropertyDescriptor、Reflect.getOwnPropertyDescriptors
3.1刪除configurable = false的屬性會報錯
'use strict' var obj = {} Object.defineProperty(obj, 'a', { configurable: false, value: 1 }) delete obj.a // 嚴格模式會報錯;非嚴格模式會返回false
3.2給writable = false的屬性賦值會報錯
'use strict' var obj = {} Object.defineProperty(obj, 'a', { writable: false, value: 1 }) obj.a = 2 // 嚴格模式會報錯;非嚴格模式不會報錯,但也不會生效,obj.a 仍然等于 1
4.給不允許擴展的object增加屬性會報錯
'use strict' var obj = {a: 1} Object.preventExtensions(obj) obj.b = 2 // 嚴格模式下會報錯;非嚴格模式不會報錯,但也不會生效 'b' in obj 為false
能將object設置為不可擴展的方法有Object.freeze、Object.seal、Object.preventExtensions;ES6還有Reflect.freeze、Reflect.seal、Reflect.preventExtensions;判斷一個object是否允許擴展可以用Object.isExtensible;ES6還有Reflect.isExtensible
5.給未申明的變量賦值會報錯
'use strict' a = 1 // 嚴格模式下將報錯,非嚴格模式a變量會提升至全局作用域
6.定義object時屬性重名會報錯
'use strict' var obj = {a: 1, a: 2}// 嚴格模式將報錯;非嚴格模式后面一個a會覆蓋前面的a,即obj.a = 2
7.形參重復時會報錯
'use strict' function fn(a, a) { console.log(a, arguments) } fn(1,2) // 嚴格模式會報錯;非嚴格模式不會報錯,a=2,arguments中兩個參數都有
8.eval相關
8.1eval有獨立作用域
'use strict' eval('var a = 1') console.log(typeof a) // 嚴格模式下為undefined;非嚴格模式下為number
8.2eval不能作為變量名或函數名,類似關鍵字
'use strict' var eval = 1 // 嚴格模式下將報錯;非嚴格模式將申明一個值為1的變量eval // 嚴格模式下將報錯;非嚴格模式將申明一個對應的eval函數 function eval() { // some code }
9.arguments相關
9.1arguments是形參的副本(類似淺拷貝)
'use strict' function fn(a, obj){ arguments[0] = 2 arguments[1].b = 2 console.log(a) // 嚴格模式為1;非嚴格模式為2 console.log(obj.b) // 2,因為js中object是地址傳遞 } fn(1, {b: 1})
9.2arguments不能作為變量名或函數名,類似關鍵字
'use strict' var arguments = 1 // 嚴格模式下將報錯;非嚴格模式將申明一個值為1的變量arguments // 嚴格模式下將報錯;非嚴格模式將申明一個對應的arguments函數 function arguments() { // some code }
10.禁用caller與callee
'use strict' function fn() { console.log(arguments.callee.caller, fn.caller) // 嚴格模式下報錯;非嚴格模式指向fn2 console.log(arguments.callee) // 嚴格模式報錯;非嚴格模式指向fn } function fn2() { fn() } fn2()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。