探究一下严格模式,也是我个人一直推崇的,简单记录一下。
在ECMAScript5引入了strict mode
----------- 方便更快地调试出错误
- 如何使用:
"use strict";
- 兼容性:
http://caniuse.com/#feat=use-strict
- 去除with
- 防止意外的全局变量
变量在赋值之前必须声明,严格模式下会抛出异常。
- 杜绝重复
对象定义了重复的属性或者函数的参数名重复
- 取消this的强制转换
当this为null或者undefined的时候,不会强制转换为全局对象,必须赋值
同样构造函数没有new 也抛错
window.color ="red"; function test(){ alert(this.color); }
- 更安全的eval
在eval中的语句声明变量:仍然呆在里面
(function(){ eval("var i = 1;"); //严格模式i没有声明,抛错 //非严格,i为1 alert(i); });
换种方式:
(function(){ var result = eval("var i=1,j=2;i+j"); //严格和非严格多是一样 alert(result); })
- eval不能作为字符串来做标识符(变量、函数名、参数名 等 )
- 函数声明无法嵌套在语句或块中,只能显示在顶级货直接显示在函数体中
function test(){ for(var i=0;i<10;i++){ function getTest(){ }; } }
- 字符串“arguments”不能用作标识符(变量或函数名、参数名等)
- 修改arguments这个对象里面的某些值的问题
function test(num){ arguments[0] = 1; console.log(num); //非严格模式1 //严格模式10,因为arguments对象只是一个本地副本 } test(10);
- 八进制数say NO
- 未来保留关键字无法使用
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
推荐编写
严格模式的方式:
;(function(){ "use strict"; function getXXX(){ } function setXXX(){ } })();
扩展阅读: