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