使用方式:'use strict';
- 为某个script标签开启严格模式
- 为某个函数开启严格模式
严格模式有哪些不同呢
- 将拼写错转成异常
- 未声明的变量不能赋值。可以防止意外创建全局变量。
- 严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操抛出异常. 例如, NaN 是一个不可写的全局变量. 在正常模式下, 给 NaN 赋值不会产生任何作用; 开发者也不会受到任何错误反馈. 但在严格模式下, 给 NaN 赋值会抛出一个异常. 任何在正常模式下引起静默失败的赋值操作 (给不可写属性赋值, 给只读属性(getter-only)赋值赋值, 给不可扩展对象(non-extensible object)的新属性赋值) 都会抛出异常。
- 在严格模式下, 试图删除不可删除的属性时会抛出异常(之前这种操作不会产生任何效果)。
- 重名属性,SyntaxError。
- 重名参数,SyntaxError。
- 进制八进制数字语法。
- 进制为原始值设置属性,TypeError。
- 简化变量使用
- 禁用with
- eval不再为上层范围引入新变量
- 严格模式禁止删除声明变量
- 让eval和arguments变得简单
- 名称 eval 和 arguments 不能通过程序语法被绑定(be bound)或赋值. (成为了关键字)
- 参数的值不会随 arguments 对象的值的改变而变化。函数的 arguments 对象会保存函数被调用时的原始参数。
- 不再支持 arguments.callee。
安全的Javascript
- fun.caller和fun.arguments不再使用
- arguments.callee
- 函数单独调用时this不默认指向window,用bind绑定this时不进行包装。
"use strict";
function fun() { return this; }
console.assert(fun() === undefined);//true
console.assert(fun.call(2) === 2);//true
console.assert(fun.apply(null) === null);//true,正常模式下返回window
console.assert(fun.call(undefined) === undefined);//true,正常模式下返回window
console.assert(fun.bind(true)() === true);//true
为未来的ECMAScript版本铺平道路
- 一部分字符变成了保留的关键字。这些字符包括implements, interface, let, package, private, protected, public, static和yield。在严格模式下,你不能再用这些名字作为变量名或者形参名。
- 严格模式禁止了不在脚本或者函数层面上的函数声明。(在if和for中不能声明函数)
Mozilla MDN