[TOC] ## 启用方法 ``` 'use strict'; ``` ### 脚本启动 ``` <script> 'use strict'; console.log('这是严格模式'); </script> ``` ### 单个函数 ``` function strict() { 'use strict'; return '这是严格模式'; } ``` ## 显式报错的情况 ### 只读属性不可写 `'abc'.length = 5; ` ### 只设置了取值器的属性不可写 ``` var obj = { get v() { return 1; } }; obj.v = 2; ``` ### 禁止扩展的对象不可扩展 ``` var obj = {}; Object.preventExtensions(obj); obj.v = 1; ``` ### eval、arguments 不可用作标识名 ### 函数不能有重名的参数 ### 禁止八进制的前缀0表示法 `var n = 0100;` ### 全局变量显式声明 `v = 1; // 报错,v未声明` ### 禁止 this 关键字指向全局对象 ``` // 严格模式 function f() { 'use strict'; console.log(this === undefined); //正常模式指向windows } f() // true ``` ### 禁止删除变量 ``` var x; delete x; // 语法错误 var obj = Object.create(null, { x: { value: 1, configurable: true } }); delete obj.x; // 删除成功 ``` ### 禁止使用 with 语句 ``` var v = 1; var obj = {}; with (obj) { v = 2; } ``` ### 新增 eval 作用域 原先只有两种作用域 全局作用域和函数作用域, 严格模式新增`eval 作用域` eval 作用域只能用在eval ``` (function () { 'use strict'; var x = 2; console.log(eval('var x = 5; x')) // 5 console.log(x) // 2 })() `` ### 新增保留字 ``` function package(protected) { // 语法错误 'use strict'; var implements; // 语法错误 } ```