深入淺析JS中的嚴(yán)格模式
什么是嚴(yán)格模式?
使JS編碼更加規(guī)范化的模式,消除Javascript語法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為
怎么使用?
直接添加下面的這句字符串就可以了,這種語法可以向后兼容,如果是不支持嚴(yán)格模式的javascript引擎,就會直接當(dāng)成是一個(gè)未賦值的字符串字面量,會直接忽略,支持的引擎就會開啟嚴(yán)格模式
'use strict'
說明:
1.在全局作用域使用的話,那整個(gè)js腳本就會開啟這種模式
2.如果是只在函數(shù)內(nèi)部使用的話,那么就只是該函數(shù)內(nèi)部開啟而已
function doSomething(){ 'use strict' // 其他代碼 }
變量
1. 在嚴(yán)格模式中什么時(shí)候創(chuàng)建變量以及怎么創(chuàng)建變量都是有限制的.首先,不允許意外創(chuàng)建全局變量.在非嚴(yán)格模式下是可以像下面這樣創(chuàng)建全局變量,但是嚴(yán)格模式中是不可以的
// 未聲明變量
// 非嚴(yán)格模式:創(chuàng)建全局變量
// 嚴(yán)格模式 :拋出referenceEror錯(cuò)誤
2.在嚴(yán)格模式下,對變量名也是有限制.特別的,不能使用implements,interface,let,package,private等保留字作為變量名,用這些變量命名的話,都會導(dǎo)出語法錯(cuò)誤
對象
在嚴(yán)格模式下 操作對象比在非嚴(yán)格模式下更容易導(dǎo)致錯(cuò)誤,下面幾種情形會導(dǎo)致語法錯(cuò)誤
1.為只讀屬性賦值會拋出TypeError
2.對不可配置的屬性使用delete 操作符會拋出TypeError
3.對不可擴(kuò)展的對象添加屬性會拋出TypeError
函數(shù)
在嚴(yán)格模式下,要求命名函數(shù)的參數(shù)必須是唯一的
// 重命名參數(shù)的 // 非嚴(yán)格模式:沒有錯(cuò)誤,只能訪問第二個(gè)參數(shù),如果要訪問第一個(gè)參數(shù),就必須通過arguments // 嚴(yán)格模式語法錯(cuò)誤 function sum(num,num){ //do something }
在嚴(yán)格模式下arguments對象的行為也有所不同.在嚴(yán)格模式下,修改命名參數(shù)的值也會反映到argument對象中,但是在嚴(yán)格模式下這兩個(gè)值是完全獨(dú)立的
function showValue(value){ value = 'foo' console.log(value) console.log(arguments[0]) // 非嚴(yán)格模式 : 'foo' 嚴(yán)格模式 :'hello' } showValu('hello')
函數(shù)
在嚴(yán)格模式中,函數(shù)的參數(shù)必須唯一
// 重名的參數(shù) // 非嚴(yán)格模式中,沒有錯(cuò)誤,只能訪問第一個(gè)參數(shù) // 嚴(yán)格模式 :拋出錯(cuò)誤 Uncaught SyntaxError: Duplicate parameter name not allowed in this context function sum(num,num){ 'use strict' // do something }
arguments對象
在非嚴(yán)格模式中,修改命名參數(shù)的值也會反應(yīng)到arguments對象中,而嚴(yán)格模式坐下,這兩個(gè)值是完全獨(dú)立的
// 修改命名參數(shù)的值 // 非嚴(yán)格模式:修改會反應(yīng)到arguments中 // 嚴(yán)格模式中不會反應(yīng)到arguments中 function sum(num,num2){ 'use strict' num=3 console.log(arguments[0],num2)// 嚴(yán)格模式下輸出為1,2 非嚴(yán)格模式下輸出為3,2 } sum(1,2)
eval()
eval函數(shù)最大的變化就是他在包含上下文中不在創(chuàng)建變量或者函數(shù):
// 使用eval函數(shù)創(chuàng)建變量 // 非嚴(yán)格模式中:彈出框彈窗 20 // 嚴(yán)格模式中:調(diào)用alert(x)時(shí)報(bào)錯(cuò) function doSomething(){ eval('var x=20') alert(x) }
在嚴(yán)格模式中,可以在eval()中聲明變量和函數(shù),但這些邊行或者函數(shù)只能在被求值的特殊作用域中有效,隨后就將被銷毀,下面這段代碼執(zhí)行就是沒問題的
'use strict' var result=eval('x=1,y=13;x+y') alert(result)
在這里,eval中聲明了變量x和y,然后將他們加在一起,反悔了他們的和,于是result變量的值就是21,即x+y的結(jié)果,在調(diào)用alert時(shí),盡管x和y已經(jīng)不存在了,result變量的值還是有效的
抑制this
在非嚴(yán)格模式下使用函數(shù)的apply()或則call()方法時(shí),null和undefined值會被轉(zhuǎn)換為全局對象,而在嚴(yán)格模式下,函數(shù)的this值始終是指定的值,無論指定的是什么值:
// 訪問屬性 // 非嚴(yán)格模式:訪問全局實(shí)行 // 嚴(yán)格模式:拋出錯(cuò)誤,因?yàn)閠his的值是null var color = "red"; function displayColor() { alert(this.color); } displayColor(null);
其他變化
在嚴(yán)格模式中with語句被拋棄掉了,在非嚴(yán)格模式中with語句能夠改變解析標(biāo)識符的路徑,但在嚴(yán)格模式下,with語句被簡化掉了,因此,在嚴(yán)格模式下使用with語句是導(dǎo)致語法錯(cuò)誤
// with語句 // 非嚴(yán)格模式:允許 // 嚴(yán)格模式:拋出語法錯(cuò)誤 with (location) { console.log(href); }
總結(jié)
以上所述是小編給大家介紹的JS中的嚴(yán)格模式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- JavaScript 引用類型實(shí)例詳解【數(shù)組、對象、嚴(yán)格模式等】
- JS嚴(yán)格模式原理與用法實(shí)例分析
- JavaScript 嚴(yán)格模式(use strict)用法實(shí)例分析
- javascript嚴(yán)格模式詳解(含嚴(yán)格模式與非嚴(yán)格模式的區(qū)別)
- 在JavaScript中使用嚴(yán)格模式(Strict Mode)
- JavaScript變量提升和嚴(yán)格模式實(shí)例分析
- JS嚴(yán)格模式知識點(diǎn)總結(jié)
- JavaScript嚴(yán)格模式下關(guān)于this的幾種指向詳解
- 深入理解javascript嚴(yán)格模式(Strict Mode)
- JavaScript嚴(yán)格模式不支持八進(jìn)制的問題講解
相關(guān)文章
JS實(shí)現(xiàn)批量上傳文件并顯示進(jìn)度功能
這篇文章主要介紹了JS實(shí)現(xiàn)批量上傳文件并顯示進(jìn)度功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-06-06使用JavaScript實(shí)現(xiàn)旋轉(zhuǎn)的彩圈特效
這篇文章主要介紹了使用JavaScript實(shí)現(xiàn)旋轉(zhuǎn)的彩圈特效的相關(guān)資料,需要的朋友可以參考下2015-06-06Ext JS動態(tài)加載JavaScript創(chuàng)建窗體的方法
這篇文章主要介紹了Ext JS動態(tài)加載JavaScript創(chuàng)建窗體的方法 ,需要的朋友可以參考下2016-06-06原生JS實(shí)現(xiàn)的多個(gè)彩色小球跟隨鼠標(biāo)移動動畫效果示例
這篇文章主要介紹了原生JS實(shí)現(xiàn)的多個(gè)彩色小球跟隨鼠標(biāo)移動動畫效果,涉及javascript事件響應(yīng)、頁面元素屬性動態(tài)修改及隨機(jī)數(shù)應(yīng)用等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02