什麼是嚴格模式? 使JS編碼更加規範化的模式,消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為 怎麼使用? 直接添加下麵的這句字元串就可以了,這種語法可以向後相容,如果是不支持嚴格模式的javascript引擎,就會直接當成是一個未賦值的字元串字面量,會直接忽略,支持的引擎就會 ...
什麼是嚴格模式?
使JS編碼更加規範化的模式,消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為
怎麼使用?
直接添加下麵的這句字元串就可以了,這種語法可以向後相容,如果是不支持嚴格模式的javascript引擎,就會直接當成是一個未賦值的字元串字面量,會直接忽略,支持的引擎就會開啟嚴格模式
'use strict'
說明:
1.在全局作用域使用的話,那整個js腳本就會開啟這種模式
2.如果是只在函數內部使用的話,那麼就只是該函數內部開啟而已
function doSomething(){ 'use strict' // 其他代碼 }
變數
1. 在嚴格模式中什麼時候創建變數以及怎麼創建變數都是有限制的.首先,不允許意外創建全局變數.在非嚴格模式下是可以像下麵這樣創建全局變數,但是嚴格模式中是不可以的
// 未聲明變數 // 非嚴格模式:創建全局變數 // 嚴格模式 :拋出referenceEror錯誤
2.在嚴格模式下,對變數名也是有限制.特別的,不能使用implements,interface,let,package,private等保留字作為變數名,用這些變數命名的話,都會導出語法錯誤
對象
在嚴格模式下 操作對象比在非嚴格模式下更容易導致錯誤,下麵幾種情形會導致語法錯誤
1.為只讀屬性賦值會拋出TypeError
2.對不可配置的屬性使用delete 操作符會拋出TypeError
3.對不可擴展的對象添加屬性會拋出TypeError
函數
在嚴格模式下,要求命名函數的參數必須是唯一的
// 重命名參數的 // 非嚴格模式:沒有錯誤,只能訪問第二個參數,如果要訪問第一個參數,就必須通過arguments // 嚴格模式語法錯誤 function sum(num,num){ //do something }
在嚴格模式下arguments對象的行為也有所不同.在嚴格模式下,修改命名參數的值也會反映到argument對象中,但是在嚴格模式下這兩個值是完全獨立的
function showValue(value){ value = 'foo' console.log(value) console.log(arguments[0]) // 非嚴格模式 : 'foo' 嚴格模式 :'hello' } showValu('hello')
函數
在嚴格模式中,函數的參數必須唯一
// 重名的參數
// 非嚴格模式中,沒有錯誤,只能訪問第一個參數
// 嚴格模式 :拋出錯誤 Uncaught SyntaxError: Duplicate parameter name not allowed in this context
function sum(num,num){ 'use strict' // do something }
arguments對象
在非嚴格模式中,修改命名參數的值也會反應到arguments對象中,而嚴格模式坐下,這兩個值是完全獨立的
// 修改命名參數的值 // 非嚴格模式:修改會反應到arguments中 // 嚴格模式中不會反應到arguments中 function sum(num,num2){ 'use strict' num=3 console.log(arguments[0],num2)// 嚴格模式下輸出為1,2 非嚴格模式下輸出為3,2 } sum(1,2)
eval()
eval函數最大的變化就是他在包含上下文中不在創建變數或者函數:
// 使用eval函數創建變數 // 非嚴格模式中:彈出框彈窗 20 // 嚴格模式中:調用alert(x)時報錯 function doSomething(){ eval('var x=20') alert(x) }
在嚴格模式中,可以在eval()中聲明變數和函數,但這些邊行或者函數只能在被求值的特殊作用域中有效,隨後就將被銷毀,下麵這段代碼執行就是沒問題的
'use strict' var result=eval('x=1,y=13;x+y') alert(result)
在這裡,eval中聲明瞭變數x和y,然後將他們加在一起,反悔了他們的和,於是result變數的值就是21,即x+y的結果,在調用alert時,儘管x和y已經不存在了,result變數的值還是有效的
抑制this
在非嚴格模式下使用函數的apply()或則call()方法時,null和undefined值會被轉換為全局對象,而在嚴格模式下,函數的this值始終是指定的值,無論指定的是什麼值:
// 訪問屬性 // 非嚴格模式:訪問全局實行 // 嚴格模式:拋出錯誤,因為this的值是null var color = "red"; function displayColor() { alert(this.color); } displayColor(null);
其他變化
在嚴格模式中with語句被拋棄掉了,在非嚴格模式中with語句能夠改變解析標識符的路徑,但在嚴格模式下,with語句被簡化掉了,因此,在嚴格模式下使用with語句是導致語法錯誤
// with語句 // 非嚴格模式:允許 // 嚴格模式:拋出語法錯誤 with (location) { console.log(href); }