嚴格模式是JavaScript中的一種限制性更強的變種模式。嚴格模式不是一個子集:它的語義上與正常代碼有着明顯的差別。
不支持嚴格模式的瀏覽器與嚴格模式的瀏覽器行爲也不同,因此不要在未經嚴格模式特性測試狀況下使用嚴格模式。
嚴格模式能夠與非嚴格模式共存,因此腳本能夠逐漸的選擇性加入嚴格模式。瀏覽器
首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯誤。
其次,嚴格模式修正了一些引擎難以優化的錯誤:一樣的代碼有些時候嚴格模式會比非嚴格模式下更快。
第三,嚴格模式禁用了一些有可能在將來版本中定義語法。app
在JavaScript中想要開啓嚴格模式,須要在全部代碼以前,定義一個不會賦給任何變量的字符串:
'use strict';//或者‘use strict’ ;
若是以前的JavaScript代碼是非嚴格模式的話,建議不要盲目爲這段代碼開啓嚴格模式,這樣可能會出現問題。建議按一個個函數去開啓嚴格模式。函數
也能夠爲某個指定的函數開啓嚴格模式,以下代碼示例:
//函數外依舊是非嚴格模式
function doSomething(){
‘user strict’};開啓嚴格模式
//其餘代碼
}
在匿名函數中使用嚴格模式,至關於在全局開啓嚴格模式的變通實現方式。
(function(){
'use strict'};//開啓嚴格模式
})();測試
在嚴格模式下,不容許意外建立全局變量。
以下代碼是非嚴格模式下意外建立的全局變量。
//message='this is message';
以下代碼是嚴格模式下意外建立全局變量。
'use strict';//開啓嚴格模式
//嚴格模式下,意外建立全局變量,拋出ReferenceError
message = 'this is message';優化
所謂靜默失敗就是既不報錯也沒有任何效果,例如改變常量的值。在嚴格模式下,靜默失敗會轉換成拋出異常。
以下代碼是非嚴格模式下的靜默失敗。
const PI= 3.14;
PI =1.14;//靜默失敗
console.log (PI);//3.14
以下代碼是嚴格模式下的靜默失敗。
'use strict';//開啓嚴格模式
const PI=3.14;
PI=1.14;//拋出Type Error錯誤this
在嚴格模式下,不能對變量使用delete運算符。
以下代碼是非嚴格模式下使用delete運算符,結果會靜默失敗。
var =color = 'red';
delete color ;
以下代碼是嚴格模式下使用delete運算符,結果會拋出異常。
'use strict';//開啓嚴格模式
var =color ='red';
delete color ;//拋出ReferenceError錯誤
對變量名的限制
在嚴格模式下,JavaScript對變量名也是有限制。特別不能使用以下內容做爲變量名:
implements,interface ,let ,package,private ,protected ,public , static,
yield。
上述內容都是保留字 在ECMAScript的下一個版本中可能會用到他們。在嚴格模式下,使用上述標識符做爲變量名會致使語法錯誤。prototype
在嚴格模式下,不能使用delete運算符刪除不可刪除的屬性。
以下代碼是嚴格模式下使用delete運算符刪除不可刪除的屬性,結果會靜默失敗。
delete Objcet.prototype;
以下代碼是嚴格模式下使用delete元素安撫刪除不可刪除的屬性,結果會拋出異常。
'use strict';//開啓嚴格模式對象
delete Object.prototype;//拋出TypeError錯誤ip
在嚴格模式下,一個對象內的全部屬性名在對象內必須惟一。
以下代碼是在非嚴格模式下重名屬性是容許的,最後一個屬性決定屬性值
var 0 ={ p:1 ,p:2};
以下代碼是嚴格模式下重命屬性被認爲是錯誤語法。
'use strict ';開啓嚴格模式。
var 0= {p:1,p:2};//報錯作用域
以下代碼是在開啓嚴格模式下爲只讀屬性從新賦值,結果會拋出異常 。
'use strict';開啓嚴格模式
var obj1={};
Object.defoneProperty(OBJ1,‘x’),{value 42,writable:false});obj1.x=9;//將屬性設置爲只讀
在嚴格模式下不能爲不可擴展的對象添加新屬性。
'use strict';開啓嚴格模式
var obj={}
Object.preventExtensions(obj);//將對象變得不可擴展
obj.newprop ='ohai';//拋出typeError錯誤
結果會出現異常
在嚴格模式下,要求命名函數的參數必須惟一。
function sum(a,a,b){
//語法錯誤
'use strict';
return a+a+c;//代碼運行到這裏會報錯
}
在嚴格模式下,arguments對象的行爲也有所不用。
嚴格模式下,修改命名參數的值也會反應到argument對象中。
嚴格模式下,命名參數與arguments對象是徹底獨立的。
function showValue(value){
value ='foo';
console.log(value);//foo
console.log(arguments[0]);//在嚴格模式下foo
//在非嚴格模式下hello
}
showValue ('hello');
arguments.callee()
在嚴格模式下,不能使用arugments 對象的callee()方法。
在嚴格模式下使用arguments對象的callee()方法,結果會拋出異常。
'use strict';//開啓嚴格模式
var f =function(){
return arguments.callee;};
f();//拋出TypeError錯誤
函數聲明的限制
在嚴格模式下,只能在全局和函數域中聲明函數
以下代碼是嚴格模式下在出全局域和函數域中聲明函數是錯誤語法
'use strict';//開啓嚴格模式
if(true){
function f(){}//錯誤語法
}
在嚴格模式下,使用eval()函數建立的變量只能在eval()函數內部使用。
以下代碼是嚴格下eval()函數建立的變量只能在eval()函數內部使用
'use strict';開啓嚴格模式
eval('var x =412');
console.log(x);//拋出RefeienceError錯誤
在嚴格模式下,如下的全部嘗試致使語法錯誤:
'use strict';開啓嚴格模式
eval=17 ;
arguments++;
++eval;
var obj ={set p (arguments){}};
var eval;
try {}catch(arguments){}
function x(eval){}
function arguments(){}
var y =function eval(){}
var f =new Function('arguments','use strict','return 17');
在嚴格模式下使用函數的apply()call()方法是,NULL或undefind值會被轉換爲全局對象。在嚴格模式下,函數的this值始終是指定的值。var color ='red';function sayColor(){console.log(this.color)}//非嚴格模式下red//嚴格模式下 拋出錯誤}say Color.call(null);