# 启用严格模式
启用严格模式很简单,只要在代码中添加如下代码即可:
```
"use strict";
```
# 为什么要用严格模式
随着JavaScript的发展,开发者及规范制定者也意识到了JavaScript语言本身的一些设计缺陷,所以在ECMAScript5中引入了严格模式。设立严格模式的目的主要是为了消除JavaScript语法上不合理的地方,从而提高代码安全性、编译效率,增加运行速度且更好地兼容JavaScript未来的新版本等。
具体来说,严格模式主要是针对如下不合理的地方作了改进,包括:
禁用with关键字、防止意外地全局变量、函数中的this不再默认指向全局、防止函数参数重名、防止对象属性重名、更安全地使用eval等。具体可以参考mozilla网站上的详细介绍。
在严格模式中针对一些编码的格式进行了限制。有些在普通模式下不会报错的代码,在严格模式中可能就会出现运行错误。这种显式抛出错误的方式比以怪异方式运行代码能更早地发现问题。
严格模式目前已经得到了除IE8之外的大部分主流浏览器的支持,所以推荐在代码中使用。
在不支持严格模式的浏览器中,如下代码会被当作普通的语句运行,不会产生副作用:
```
<script>
"use strict";
console.log("这是严格模式。");
</script>
<script>
console.log("这是正常模式。");
</script>
```
下面介绍在使用严格模式时需要遵循的几条最佳实践。
## 1. 不要在全局中启用严格模式
若全局设置严格模式,将意味着代码文件中所有的代码都必须遵守严格模式。除非所有的代码都是自己维护,否则这么做会带来风险,因为不能保证其他人维护的代码也是符合严格模式的。比如如下的代码中,在代码文件设置了全局严格模式,应该避免这样的设置方式。
```
"use strict";
function doSomething() {
// 这部分代码会运行于严格模式
}
function doSomethingElse() {
// 这部分代码也会运行于严格模式
}
```
即使是其他人维护的代码在不同的文件中也不建议这么做,因为很难保证发布时候代码不会合并,所以尽量把严格模式限定在函数作用域范围内。类似如下的设置方式:
```
function doSomething() {
"use strict";
// 这个函数中的代码将会运行于严格模式
}
function doSomethingElse() {
// 这个函数中代码不会运行于严格模式
}
```
如果想给大量的代码设置严格模式,可以把代码包含在一个立即执行的函数内,并在函数开头启用严格模式,示例代码如下:
```
(function (){
"use strict";
// 其他代码
})();
```
## 2. 在已有代码中谨慎启用严格模式
如果代码中还包含有不符合严格模式的代码,则启用严格模式会产生风险,因为有可能会导致代码运行错误,页面无法正常展示和交互。在已有代码中启用严格模式要和代码的重构一样受到重视——必须有足够的代码检查和测试,确保每一行代码都可以正常运行。
尽管使用严格模式有如上这些的风险,但是只要使用得当,严格模式可以帮助开发者尽早发现一些潜在的问题。所以推荐在编写JavaScript代码时启用严格模式。
- javascript封装
- jquery封装
- layui封装
- 基本知识
- 匿名函数
- 严格模式
- 代码规范工具
- 使用JSHint和JSLint
- 构建
- Grunt
- gulp
- Gulp使用入门操作十一步压缩JS
- 注意
- 初级
- 中级
- 高级
- 将es6代码转成es5
- 我常用的
- 报错处理
- 《编写可维护的Javascript》
- 第1章:基本的格式化
- 缩进层级
- 语句结尾
- 行的长度
- 换行
- 空行
- 命名
- 变量和函数
- 常量
- 构造函数
- 直接量
- 第2章:注释
- 单行注释
- 多行注释
- 使用注释
- 文档注释
- 第3章:语句和表达式
- 花括号的对齐方式
- 块语句间隔
- switch语句
- 第4章:变量函数运算符
- 变量声明
- 函数声明
- 函数调用间隔
- 立即调用函数
- 严格的模式
- 相等
- 第5章:UI的松耦合
- 什么是松耦合
- 将javascript从css中抽离
- 将css从javascript中抽离
- 将javascript从html中抽离
- 将html从javascript中抽离
- 第6章:避免使用全局变量
- 全局变量带来的问题
- 意外的全局变量
- 单全局变量方式
- 零全局变量
- 第7章:事件处理
- 典型用法
- 规则1:隔离应用逻辑
- 规则2:不要分发事件对象
- 第8章:避免“空比较”
- 检测原始值
- 检测应用值
- 检测属性
- 第9章:将配置数据从代码中分离出来
- 什么是配置数据
- 抽离配置数据
- 保存配置数据
- 第10章:抛出自定义错误
- 错误的本质
- 在javascript抛出错误
- 抛出错误的好处
- 何时抛出错误
- try-catch语句
- 错误类型
- 第11章:不是你的对象不要动
- 什么是你的
- 原则
- 更好的途径
- 关于Polyfill的注释
- 阻止修改
- 第12章:浏览器嗅探
- User-Agent嗅探
- 特性检测
- 避免特性推断
- 避免浏览器推断
- 应当如何取舍
- 第13章:目录和文件结构
- 最佳实践
- 基本结构
- 第14章:Ant
- 安装
- 配置文件
- 执行构建
- 目标操作的依赖
- 属性
- Buildr项目
- 第15章:校验
- 查找文件
- 任务
- 增强的目标操作
- 其他方面的改进
- Buidr任务
- 第16章:文件的合并与加工
- 任务1
- 行尾结束符
- 文件头和文件尾
- 加工文件
- 第17章:文件的精简与压缩
- 文件精简
- 压缩
- 第18章:文档化
- JSDoc Toolkit
- YUI DOC
- 第19章:自动化测试
- YUI Test Selenium引擎
- Yeti
- PhantomJS
- JsTestDriver
- 第20章:组装到一起
- Javascript编码风格指南