什么是严格模式?

使得JavaScript在更严格的语法条件下运行。目的是:

  • 消除JavaScript语法的一些不合理不严谨的地方,减少“意外情况”
  • 提高代码运行的安全性
  • 为未来的版本做铺垫

怎么使用严格模式?

  • 针对整个脚本:在脚本文件的第一行添加 "use strict"
  • 针对单个函数:在函数体的第一行添加 "use strict"

如果浏览器不支持,这句话只会解析为一条普通语句,没有副作用。

变通写法:第一种方法不利于脚本文件的合并,所以更好的方法是用第二种方法,然后将整个脚本文件放在一个立即执行的匿名函数中。

使用严格模式后,语法和行为有哪些改变?

  • 必须用 var 生命变量
  • 禁止自定义函数中的 this 指向 window
  • 创建 eval 作用域
  • 对象不能有重名的属性

严格模式和普通模式有啥区别?

  • 全局变量显式声明

普通模式下,如果一个变量没声明就使用,默认是全局变量;
严格模式下,全局变量必须显式声明。

  • 禁止自定义函数中的 this 指向 window

    1. var foo = function(){
    2. console.log(this);
    3. }
    4. foo();

    上面代码,普通模式下输出 window ,严格模式下输出 undefined

  • 禁止使用with语句

因为 with 语句没法在编译时就确定属性属于哪个对象

  • 构造函数必须通过 new 来实例化对象

因为 thisundefined ,此时无法设置属性。以下代码会报错。

  1. var foo = function(name){
  2. this.name = name;
  3. }
  4. foo("hhha");

正常模式下,上面代码会在 window 对象下生成全局变量 name

  • 对象不能有重名的属性
  • 函数必须声明在顶层

严格模式只允许在全局作用域或者函数作用域的顶层 声明函数,也就是说,不允许在非函数的代码块内声明函数;因为新版本会引入“块级作用域”

  • 新增关键词

implements,interface,let,package,private,protected,public,static,yield