javascript嚴(yán)格模式詳解(含嚴(yán)格模式與非嚴(yán)格模式的區(qū)別)
嚴(yán)格模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 提高代碼解析與運(yùn)行速度
- 禁用一些不合理的語(yǔ)法,減少代碼的怪異行為
缺點(diǎn)
- 某些代碼在嚴(yán)格模式下會(huì)報(bào)錯(cuò),尤其引入公用與第三方模塊的時(shí)候需要注意
- 有些嚴(yán)格模式的特性在不同瀏覽器的支持情況不同,需要注意兼容問(wèn)題
嚴(yán)格模式與非嚴(yán)格模式的區(qū)別
1.禁用with語(yǔ)法,使用將報(bào)錯(cuò)
因?yàn)榻馕鰓ith語(yǔ)法時(shí)作用域的情況會(huì)非常復(fù)雜,嚴(yán)重影響代碼的解析與運(yùn)行速度
function usualMode() { with({a: 1}) { console.log(a) } } usalMode() // 正常輸出 1 function strictMode() { 'use strict' with({a: 1}) { console.log(a) } } strictMode() // 將報(bào)錯(cuò)
2.禁止刪除變量與函數(shù)
function usualMode() { function fn() {} var a = 1 delete a // 不會(huì)報(bào)錯(cuò),但實(shí)際上也沒(méi)能刪除變量a delete fn // 同delete a } usalMode() // 正常執(zhí)行 function strictMode() { 'use strict' function fn() {} var a = 1 delete a } strictMode() // 將報(bào)錯(cuò)
3.屬性描述符(propertyDescriptor)相關(guān)
能改變屬性描述符的方法有Object.defineProperty、Object.defineProperties、Reflect.defineProperty、Reflect.defineProperties、Object.freeze、Object.seal;獲取一個(gè)屬性描述符可以用Object.getOwnPropertyDescriptor、Object.getOwnPropertyDecriptors,ES6中還有Reflect.getOwnPropertyDescriptor、Reflect.getOwnPropertyDescriptors
3.1刪除configurable = false的屬性會(huì)報(bào)錯(cuò)
'use strict' var obj = {} Object.defineProperty(obj, 'a', { configurable: false, value: 1 }) delete obj.a // 嚴(yán)格模式會(huì)報(bào)錯(cuò);非嚴(yán)格模式會(huì)返回false
3.2給writable = false的屬性賦值會(huì)報(bào)錯(cuò)
'use strict' var obj = {} Object.defineProperty(obj, 'a', { writable: false, value: 1 }) obj.a = 2 // 嚴(yán)格模式會(huì)報(bào)錯(cuò);非嚴(yán)格模式不會(huì)報(bào)錯(cuò),但也不會(huì)生效,obj.a 仍然等于 1
4.給不允許擴(kuò)展的object增加屬性會(huì)報(bào)錯(cuò)
'use strict' var obj = {a: 1} Object.preventExtensions(obj) obj.b = 2 // 嚴(yán)格模式下會(huì)報(bào)錯(cuò);非嚴(yán)格模式不會(huì)報(bào)錯(cuò),但也不會(huì)生效 'b' in obj 為false
能將object設(shè)置為不可擴(kuò)展的方法有Object.freeze、Object.seal、Object.preventExtensions;ES6還有Reflect.freeze、Reflect.seal、Reflect.preventExtensions;判斷一個(gè)object是否允許擴(kuò)展可以用Object.isExtensible;ES6還有Reflect.isExtensible
5.給未申明的變量賦值會(huì)報(bào)錯(cuò)
'use strict' a = 1 // 嚴(yán)格模式下將報(bào)錯(cuò),非嚴(yán)格模式a變量會(huì)提升至全局作用域
6.定義object時(shí)屬性重名會(huì)報(bào)錯(cuò)
'use strict' var obj = {a: 1, a: 2}// 嚴(yán)格模式將報(bào)錯(cuò);非嚴(yán)格模式后面一個(gè)a會(huì)覆蓋前面的a,即obj.a = 2
7.形參重復(fù)時(shí)會(huì)報(bào)錯(cuò)
'use strict' function fn(a, a) { console.log(a, arguments) } fn(1,2) // 嚴(yán)格模式會(huì)報(bào)錯(cuò);非嚴(yán)格模式不會(huì)報(bào)錯(cuò),a=2,arguments中兩個(gè)參數(shù)都有
8.eval相關(guān)
8.1eval有獨(dú)立作用域
'use strict' eval('var a = 1') console.log(typeof a) // 嚴(yán)格模式下為undefined;非嚴(yán)格模式下為number
8.2eval不能作為變量名或函數(shù)名,類似關(guān)鍵字
'use strict' var eval = 1 // 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)值為1的變量eval // 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)對(duì)應(yīng)的eval函數(shù) function eval() { // some code }
9.arguments相關(guān)
9.1arguments是形參的副本(類似淺拷貝)
'use strict' function fn(a, obj){ arguments[0] = 2 arguments[1].b = 2 console.log(a) // 嚴(yán)格模式為1;非嚴(yán)格模式為2 console.log(obj.b) // 2,因?yàn)閖s中object是地址傳遞 } fn(1, {b: 1})
9.2arguments不能作為變量名或函數(shù)名,類似關(guān)鍵字
'use strict' var arguments = 1 // 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)值為1的變量arguments // 嚴(yán)格模式下將報(bào)錯(cuò);非嚴(yán)格模式將申明一個(gè)對(duì)應(yīng)的arguments函數(shù) function arguments() { // some code }
10.禁用caller與callee
'use strict' function fn() { console.log(arguments.callee.caller, fn.caller) // 嚴(yán)格模式下報(bào)錯(cuò);非嚴(yán)格模式指向fn2 console.log(arguments.callee) // 嚴(yán)格模式報(bào)錯(cuò);非嚴(yán)格模式指向fn } function fn2() { fn() } fn2()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何編寫(xiě)一個(gè) Webpack Loader的實(shí)現(xiàn)
這篇文章主要介紹了如何編寫(xiě)一個(gè) Webpack Loader的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10JavaScript函數(shù)執(zhí)行、作用域鏈以及內(nèi)存管理詳解
這篇文章主要介紹了JavaScript函數(shù)執(zhí)行、作用域鏈以及內(nèi)存管理的知識(shí),文章內(nèi)容非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01JavaScript實(shí)現(xiàn)飛舞的泡泡效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)飛舞的泡泡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02利用JavaScript實(shí)現(xiàn)ISO周日歷
周日歷是日常生活中不常用到的歷法系統(tǒng),一般用于政府、商務(wù)的會(huì)計(jì)年度或者學(xué)校教學(xué)日歷中。本文將利用JavaScript制作個(gè)簡(jiǎn)單的周日歷,感興趣的可嘗試一下2022-07-07javascript實(shí)現(xiàn)鎖定網(wǎng)頁(yè)、密碼解鎖效果(類似系統(tǒng)屏幕保護(hù)效果)
這篇文章主要介紹了javascript實(shí)現(xiàn)鎖定網(wǎng)頁(yè)、密碼解鎖效果,跟Windows系統(tǒng)的屏幕保護(hù)效果類似,需要的朋友可以參考下2014-08-08微信小程序利用swiper+css實(shí)現(xiàn)購(gòu)物車商品刪除功能
這篇文章主要介紹了微信小程序利用swiper+css實(shí)現(xiàn)購(gòu)物車商品刪除功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03bootstrap日歷插件datetimepicker使用方法
這篇文章主要為大家詳細(xì)介紹了bootstrap日歷datetimepicker插件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12