严格模式
"use strict";
a=1; //ReferenceError: a is not defined
"use strict";
NaN=1 //TypeError: Cannot assign to read only property 'NaN' of object
//非严格模式下,不会报错
delete Object.prototype; //TypeError: Cannot delete property 'prototype' of function Object()
//非严格模式下,不会报错
"use strict";
var obj={
p:1;
p:2
}; //报错
"use strict";
function fun(a,a){
console.log(a); // SyntaxError: Duplicate parameter name not allowed in this context
}
fun(1,2);
function fun(a,a){
console.log(a);
}
fun(1,2); // 2
0123
这样子都不被允许,但是0o123
可以在严格模式下使用(ES6),二进制形式也被允许使用0x1010
"use strict";
let a=0123; // SyntaxError: Octal literals are not allowed in strict mode.
let b=0o123; // 不报错
let c=0x1010; // 不报错
"use strict";
true.p=1; // TypeError: Cannot create property 'name' on boolean 'true'
with
eval()
函数内创建新的变量,不会再引入到函数所在的作用域内。 "use strict";
eval('var a=1;');
console.log(a); // ReferenceError: a is not defined
eval('"use strict";var a=1;');
console.log(a); // ReferenceError: a is not defined
eval('var a=1;');
console.log(a); // 1
delete
删除不能删除的东西,比如变量,将会报错 "use strict";
var a=1;
delete a; // SyntaxError: Delete of an unqualified identifier in strict mode.
eval
和arguments
不允许被绑定和赋值 "use strict";
function fun(a,b){
a=0;
console.log(a,b); // 0 2
console.log(arguments[0],arguments[1]); // 1 2
}
fun(1,2);
"use strict";
function fun(a,b){
arguments[0]=0;
console.log(a,b); // 1 2
console.log(arguments[0],arguments[1]); // 0 2
}
fun(1,2);
function fun(a,b){
arguments[0]=0;
console.log(a,b); // 0 2
console.log(arguments[0],arguments[1]); // 0 2
}
fun(1,2);
arguments
对象的callee
属性不被允许使用,删除,赋值this
发生了改变。没有指定this
的话,它的值就是undefined
(针对全局window),并且不再支持自动将this
转换为对象的功能 "use strict";
function fun(a){
console.log(this);
}
fun.call(true) // true
"use strict";
function fun(a){
console.log(this);
}
fun() // undefined
function fun(a){
console.log(this);
}
fun.call(true) // Boolean对象
function fun(a){
console.log(this);
}
fun() // window对象
并且这还会导致一个问题
function Student(){
this.name="jpc";
this.age=19;
}
let stu=Student(); // TypeError: Cannot set property 'name' of undefined
/*
当我们启用了严格模式,原本是想要通过构造函数构造严格Student实例,忘了new。
由于是在严格模式下,所以this的值是undefiend,所以报错了。
而在非严格模式的情况下,此时window全局下会都出一个window.name和window.age属性
*/
fun
的函数,fun.caller
fun.arguments
(不是arguments
)和arguments.caller
都不能被访问,赋值和删除。这里需要注意的是,是在函数内使用了严格模式,即函数外作用域(或全局)设置了严格模式,是不受到影响的
//设置参数默认值的报错
function fun(x=0){
"use strict";
console.log(x) //报错
}
fun(1);
//设置解构赋值的报错
function fun({x}){
"use strict";
console.log(x) //报错
}
fun({x:1});
//设置rest参数的报错
function fun(...x){
"use strict";
console.log(x) //报错
}
fun(0,1,2,3);
//不在函数内使用严格模式,无报错,正常运行
"use strict";
function fun(x=0){
console.log(x) //1
}
fun(1);
function fun({x}){
console.log(x) //1
}
fun({x:1});
function fun(...x){
console.log(x) //[0,1,2,3]
}
fun(0,1,2,3);
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。