严格模式 
严格模式是采用具有限制性 JavaScript 变体的一种方式。
启用严格模式 
js
"use strict"; // 整个脚本都开启严格模式的语法js
function strict() {
  // 函数级别严格模式语法
  'use strict';
}在严格模式中运行非严格模式的代码,可能报错。因此推荐使用函数级别严格模式。
严格模式的改变 
将问题直接转化为错误 
- 未定义的变量,不再创建为全局变量
- 不可写属性、只读属性、不可扩展对象新属性赋值,不再静默失败
- 删除不可删除的属性,不再静默失败
- 定义对象时出现重名属性,报语法错误
- 函数的参数名出现重名,报语法错误
- 禁止八进制数字语法。如017表示15
- 禁止设置基本类型的属性。如false.val = ''
编译器优化 
通过禁用JavaScript的部分灵活功能来方便编译器优化代码:
- 禁用with
- eval不会使得内部定义影响到- eval外部变量
- 禁止删除仅声明但未定义变量
- eval、- arguments像保留字一样,不可任意使用
- 禁用arguments.callee
更安全 
- this不做类型转换,没有指定时默认值为- undefined
- 禁用 fn.arguments、fn.caller
- 禁用arguments.caller
为未来版本增加保留字 
在严格模式下,不能再用这些名字作为变量名或者形参名:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
禁止任意位置的函数声明 
js
"use strict";
if (true) {
  function f() { } // !!! 语法错误
  f();
}
for (var i = 0; i < 5; i++) {
  function f2() { } // !!! 语法错误
  f2();
}
function foo() { // 合法
  function bar() { } // 同样合法
}