ECMAScript 5严格模式(Strict Mode)介绍


Posted in Javascript onMarch 02, 2015

严格模式(Strict Mode)是ECMAScript 5的新特性,它允许你把整个程序,或者某个函数,放置在“严格”的操作语境中。这种严格的语境会防止某些特定的操作并抛出更多的异常。

虽然ECMAScript 5对ECMAScript 3是向下兼容的,但是在严格模式下,所有在ECMAScript 3中不赞成使用的特性都被禁用(或抛出错误)而不是兼容。

启用严格模式有以下好处:

1.捕获一些编程错误,并抛出异常。
2.阻止进行一些相对“不安全”的操作(例如访问全局变量),抛出异常。
3.禁用一些让人迷惑的特性。

关于严格模式的大多数信息都可以在《ES5规范》[PDF]的第223页找到。

(注意:ECMAScript 5的严格模式跟Firefox的严格模式是不同的)

如何启用严格模式

在程序的开头添加这条语句即可对整段脚本启用严格模式:

'use strict';

也可以只在函数的内部启用严格模式,这样不会影响到外部:
function imStrict() {
'use strict';

// ... your code ...

}

启用严格模式的语句只是一段普通的字符串“use strict”,没有任何新语法。这意味着不会对就旧式浏览器造成任何负面影响。

在函数内部启用严格模式的一个实际应用是,把整个Javascript类库定义在严格模式的函数内部,这样就可以不影响外部的代码:

// Non-strict code...
(function(){

"use strict";

// Define your library strictly...

})();
// Non-strict code...

那么,严格模式下的脚本有什么改变呢?

变量和属性

对未定义变量的赋值将会失败,而不是把这个变量作为全局变量。

写入一个可写特性为false的属性,删除一个可配置特性为false的属性,或者添加一个可扩展特性为false的属性,都会导致错误(这些特性是预先商定好的)。过去,这些操作不会抛出异常,仅仅是静默地失败。

对变量、函数或者函数参数执行delete操作会导致错误。

var foo = 'test';

function test() { }
delete foo; // Error

delete test; // Error
function test2(arg) {

delete arg; // Error

}

在一个对象容器内部定义相同属性会导致异常的抛出:
// Error

{ foo: true, foo: false }

eval

任何对“eval”这个名字的使用(主要意图是把eval函数指向一个变量或者是对象的属性)都是禁止的。

// All generate errors...

obj.eval = ...

obj.foo = eval;

var eval = ...;

for ( var eval in ... ) {}

function eval(){}

function test(eval){}

function(eval){}

new Function("eval")

另外,通过eval声明新变量也会无效:
eval("var a = false;");

print( typeof a ); // undefined

函数

重写arguments对象会导致错误:

arguments = [...]; // not allowed

同名参数会导致错误:
(function(foo, foo) { }) // Error

对arguments.caller和arguments.callee的访问会抛出异常。因此,任何需要用到的匿名函数都必须先命名,例如:
setTimeout(function later(){
// do stuff...

setTimeout(later, 1000);

}, 1000 );

函数的arguments、caller和callee属性不再存在,定义它们的操作也是禁止的。
function test() { }

test.caller = 'caller';// Error

最后,一个长期存在(且非常讨厌)的BUG已经被解决了:当使用null或者undefined作为Function.prototype.call或Function.prototype.apply方法的第一个参数时,函数内部的this将会指向全局对象。而严格模式将会阻止其执行并抛出异常:
(function(){ ... }).call(null); // Exception

with() { }

with() { }语句在严格模式下是完全挂掉了。

Javascript 相关文章推荐
XHTML-Strict 内允许出现的标签
Dec 11 Javascript
用Javascript 获取页面元素的位置的代码
Sep 25 Javascript
鼠标滑在标题上显示图片的JS代码
Nov 19 Javascript
浅谈javascript的分号的使用
May 12 Javascript
基于javascript实现图片滑动效果
May 07 Javascript
分享JS数组求和与求最大值的方法
Aug 11 Javascript
vue组件中的样式属性scoped实例详解
Oct 30 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 Javascript
原生javascript单例模式的应用实例分析
Feb 23 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
在Uni中使用Vue的EventBus总线机制操作
Jul 31 Javascript
OpenLayers3实现对地图的基本操作
Sep 28 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
Mar 02 #Javascript
JavaScript日期类型的一些用法介绍
Mar 02 #Javascript
了解Javascript的模块化开发
Mar 02 #Javascript
JS实现的4种数字千位符格式化方法分享
Mar 02 #Javascript
js实现图片漂浮效果的方法
Mar 02 #Javascript
ECMAScript 5中的属性描述符详解
Mar 02 #Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
Mar 02 #Javascript
You might like
php笔记之常用文件操作
2010/10/12 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
php MessagePack介绍
2013/10/06 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
Javascript之String对象详解
2016/06/08 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python微信公众号之关注公众号自动回复
2018/10/25 Python
Django实现跨域的2种方法
2019/07/31 Python
python__name__原理及用法详解
2019/11/02 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
公司年会策划方案
2014/05/17 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
2015年度企业工作总结
2015/05/21 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
nginx.conf配置文件结构小结
2022/04/08 Servers