什么是严格模式?
使得JavaScript在更严格的语法条件下运行。目的是:
- 消除JavaScript语法的一些不合理不严谨的地方,减少“意外情况”
- 提高代码运行的安全性
- 为未来的版本做铺垫
怎么使用严格模式?
- 针对整个脚本:在脚本文件的第一行添加
"use strict"
; - 针对单个函数:在函数体的第一行添加
"use strict"
;
如果浏览器不支持,这句话只会解析为一条普通语句,没有副作用。
变通写法:第一种方法不利于脚本文件的合并,所以更好的方法是用第二种方法,然后将整个脚本文件放在一个立即执行的匿名函数中。
使用严格模式后,语法和行为有哪些改变?
- 必须用
var
生命变量 - 禁止自定义函数中的
this
指向window
- 创建
eval
作用域 - 对象不能有重名的属性
严格模式和普通模式有啥区别?
- 全局变量显式声明
普通模式下,如果一个变量没声明就使用,默认是全局变量;
严格模式下,全局变量必须显式声明。
禁止自定义函数中的
this
指向window
var foo = function(){
console.log(this);
}
foo();
上面代码,普通模式下输出
window
,严格模式下输出undefined
禁止使用with语句
因为 with
语句没法在编译时就确定属性属于哪个对象
- 构造函数必须通过
new
来实例化对象
因为 this
为 undefined
,此时无法设置属性。以下代码会报错。
var foo = function(name){
this.name = name;
}
foo("hhha");
正常模式下,上面代码会在 window
对象下生成全局变量 name
;
- 对象不能有重名的属性
- 函数必须声明在顶层
严格模式只允许在全局作用域或者函数作用域的顶层 声明函数,也就是说,不允许在非函数的代码块内声明函数;因为新版本会引入“块级作用域”
- 新增关键词
implements,interface,let,package,private,protected,public,static,yield