FF、Chrome、IE10+、Safari、Operajavascript
"use strict";
老版本瀏覽器將以上源碼當作字符串處理java
<script> "use strict"; console.log('全局嚴格模式'); </script>
function fn() { "use strict"; console.log('局部嚴格模式,只在函數內有效'); }
var
顯式聲明//正常模式下 a = 1; console.log(a);//1
//嚴格模式下 "use strict"; a = 1; console.log(a);//報錯
with
width
語句在編譯時沒法肯定屬性歸屬於哪一個對象eval
做用域
eval
中執行的做用於取決於它處於全局仍是函數做用域內;eval
自己有獨立的做用域//正常模式下 var a = 1; console.log(eval('var a = 1;a'));//2 console.log(a);//2
//嚴格模式下 var a = 1; console.log(eval('var a = 2;a'));//2 console.log(a);//1
this
默認不指向全局對象window
this
指向window
;this
再也不默認指向window
//正常模式下 function fn() { this.a = 1; } fn(); a;//1
//嚴格模式下 "use strict"; function fn() { this.a = 1; } fn(); a;//報錯
arguments
和caller
被禁用
arguments
指向傳遞的參數,caller
指向函數引用;arguments
和caller
被禁用,報錯delete
能夠刪除定義的變量;configurable
爲true
的對象屬性才能被刪除,var
定義的變量不能被刪除//正常模式下 var a = 1; delete a;//a不會被刪除,也不報錯 a;//1 var obj = { o1: 1, o2: 2 }; delete obj.o1;//obj中o1屬性被刪除 obj.o1;//undefined;
//嚴格模式下 "use strict"; var a = 1; delete a;//報錯 a;//1 var obj = { o1: 1, o2: 2 }; delete obj.o1; obj.o1;//undefined;
getter
方法賦值報錯arguments
輸出時,可區分參數值;//正常模式下 function fn(a, a, b) { console.log(a); console.log(arguments[0]); console.log(arguments[1]); } fn(1,2,3);//2 1 2
//嚴格模式下 "use strict"; function fn(a, a, b) { console.log(a); console.log(arguments[0]); console.log(arguments[1]); } fn(1,2,3);//報錯
0
,表示八進制,可正常轉換輸出對應的十進制數;//正常模式下 console.log(012);//10
//嚴格模式下 'use strict'; console.log(012);//報錯
arguments
賦值
arguments
從新賦值;arguments
跟蹤變化
arguments
也隨之變化;//正常模式下 function fn(a, b, c) { arguments[1] = 4; console.log(a, b, c);//1, 4, 3 console.log(arguments[1]);//4 } fn(1, 2, 3);
//嚴格模式下 'use strict'; function fn(a, b, c) { arguments[1] = 4; console.log(a, b, c);//1, 2, 3 console.log(arguments[1]);//4 } fn(1, 2, 3);
arguments.callee
被禁用
arguments.callee
指向函數引用;//正常模式下 function fn(a) { console.log(arguments.callee); } fn(1);//輸出原函數體
//嚴格模式下 'use strict'; function fn(a) { console.log(arguments.callee); } fn(1);//報錯
if
或for
代碼塊內;//正常模式下 if(true) { function fn(a) { console.log(a); } } fn(1);//1
//嚴格模式下 'use strict'; if(true) { function fn(a) { console.log(a); } } fn(1);//報錯,函數不存在
implements
、interface
、let
、package
、private
、protected
、public
、static
、yield