JavaScript 严格模式(strict mode)

2020-02-03

概述

ECMAScript 5的严格模式(strict mode)是采用具有限制性JavaScript变体的一种方式,使代码区别于正常模式(或非严格模式)(sloppy mode),形成与正常代码不同的语义。

意义

设立"严格模式"的目的,主要有以下几个:

  • 严格模式通过抛出错误来消除了一些原有静默错误。
  • 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
  • 严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法, 为未来新版本的Javascript做好铺垫。

启用标识

"use strict"('use strict')

严格模式有效作用域

严格模式可以应用到整个脚本的全局范围内或函数中,在封闭大括弧 {} 内启用严格模式是无效的。

// 在封闭大括弧 {} 内启用严格模式是无效的
{
  'use strict'
  // some code here
}

调用严格模式

为脚本开启严格模式

为整个脚本文件开启严格模式,需要在所有代码语句前启用标识。严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。

// 整个脚本都开启严格模式
'use strict';
// some code here

为函数开启严格模式

将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行

  function strict(){
    "use strict";
    return "这是严格模式。";
  }
  
  function notStrict() {
    return "这是正常模式。";
  }

非严格模式到严格模式的区别

  • 禁止八进制语法:var n = 023和var s = “\047”
  • 禁止with语句
  • 禁止delete删除一个变量名(而不是属性名):delete myVariable
  • 禁止使用未来保留字(也许会在ECMAScript 6中使用):implements, interface, let, package,
    private, protected, public, static,和yield作为变量名或函数名
  • 禁止对象字面量中使用两个相同的属性名:{a: 1, b: 3, a: 7}
  • 给一个未声明的变量赋值
    在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式下,全局变量必须显式声明。
  "use strict";
           // 假如有一个全局变量叫做a
  aa = 17; // 因为变量名拼写错误
		   // 正常模式:自动创建一个新的aa全局变量
		   // 严格模式:抛出 ReferenceError
  • 禁止this关键字指向全局对象
  function f(){
    return this;
  }
  // 返回false,因为"this"指向全局对象
  
  function f(){
    "use strict";
    return this;
  }
// 返回true,因为严格模式下,this的值为undefined

因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

  function f(){
    "use strict";
    this.a = 1;
  };
  f();// 报错,this未定义
  • 创设eval作用域
    正常模式下,Javascript语言有两种变量作用域:全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
  "use strict";
  let x = 2;
 console.log(eval("let x = 5; x")); // 5
 console.log(x); // 2

以上列举的是常见的区别,更多区别详见参考链接

参考链接
MDZ 严格模式
Javascript 严格模式详解

你可能感兴趣的:(JavaScript)