严格模式


JS严格模式的原因以及浏览器严格模式


主要建立在MDN|严格模式基础上进行讲解。

严格模式是JS的一个子集,采用具有限制性JavaScript变体的一种方式,使代码更加模范,在更加严格的条件下进行。

目的

设置“严格模式”的目的,有以下:

  • 规范JS代码,消除一些语法不合理的地方,以及写出更加安全的代码。
  • 提高编译器效率。
  • 为未来的ECMAScript版本铺平道路。

这个模式体现了JS将会向更合理、更安全、更严谨的方向发展。

标志

1
"use strict"

(老版本的浏览器会把它当成一行普通字符串,从而忽略)

调用模式

严格模式可以应用到整个脚本或者个别函数中。注意在 eval 、Function 、内联事件处理属性、 WindowTimers.setTimeout() 方法中传入的脚本字符串,其行为类似于开启了严格模式的一个单独脚本,它们会如预期一样工作。

整个脚本文件

在所有语句之前进行声明

1
use strict

函数

在函数体所有语句之前进行声明

1
use strict

需要注意的地方

  • 在{}内进行严格模式的声明是没有效果的,然而在 eval 、Function 、内联事件处理属性、 WindowTimers.setTimeout() 方法中传入的脚本字符串,其行为类似于开启了严格模式的一个单独脚本,它们会如预期一样工作。
  • 为整个文本开启严格模式时,合并冲突代码容易存在陷阱:合并严格模式的代码+非严格模式的代码->严格模式的代码,容易造成系统无法如预期进行。
  • 为了解决第二点,1. 按一个个函数去开启严格模式;2.可以把严格声明的脚本用一个函数包起来(闭包),在函数中使用严格模式,则可以消除合并的问题。

严格模式带来的变化

  1. 将问题直接转化成错误
  2. 简化变量的使用
  3. 让eval和arguments变得简单

浏览器严格模式

主流浏览器现在实现了严格模式。但是不要盲目的依赖它,因为市场上仍然有大量的浏览器版本只部分支持严格模式或者根本就不支持(比如IE10之前的版本)。严格模式改变了语义。依赖这些改变可能会导致没有实现严格模式的浏览器中出现问题或者错误。谨慎地使用严格模式,通过检测相关代码的功能保证严格模式不出问题。最后,记得在支持或者不支持严格模式的浏览器中测试你的代码。如果你只在不支持严格模式的浏览器中测试,那么在支持的浏览器中就很有可能出问题,反之亦然。