ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";
。
严格模式主要有以下限制。
- 变量必须声明后再使用
- 函数的参数不能有同名属性,否则报错
- 不能使用
with
语句 - 不能对只读属性赋值,否则报错
- 不能使用前缀0表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错
- 不能删除变量
delete prop
,会报错,只能删除属性delete global[prop]
eval
不会在它的外层作用域引入变量eval
和arguments
不能被重新赋值arguments
不会自动反映函数参数的变化- 不能使用
arguments.callee
- 不能使用
arguments.caller
- 禁止
this
指向全局对象 - 不能使用
fn.caller
和fn.arguments
获取函数调用的堆栈 - 增加了保留字(比如
protected
、static
和interface
) - 其中,尤其需要注意
this
的限制。ES6 模块之中,顶层的this
指向undefined
,即不应该在顶层代码使用this
。
ES6严格模式需要注意的地方
1. 块级函数
"use strict";
if (true) {
function f() { } // 语法错误
}
es5中严格模式下禁止声明块级函数,而在es6的严格模式中可以声明块级函数,并可以在块级作用
'use strict'
var b= true;
if(b){
function test(){
console.log('我是块级函数')
}
test(); //可以正常运行
}
console.log(typeof test) //块级作用域外无法访问
2. 箭头函数
箭头函数是es6中新增的一种特殊函数,不管是否处于严格模式下,箭头函数的参数都不能有同名的。而ES5中,只有在严格模式下函数的参数才不能有同名
3.字面量对象重复属性问题
es5的严格模式中,如果对象属性重名则会报错,es6则不管是不是严格模式,如果有同名属性,则后面的属性覆盖前面的
4.模块模式
采用es6的模块化开发时,代码自动运行在严格模式下且没有任何办法跳出严格模式
5.类模式
在es6中不管是类声明还是类表达式,其内部使用的都是严格模式。