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 相关文章推荐
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
Apr 17 Javascript
jquery checkbox实现单选小例
Nov 27 Javascript
JS实现鼠标单击与双击事件共存
Mar 08 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
Jun 22 Javascript
node.js中的http.response.write方法使用说明
Dec 14 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
May 25 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
Jun 21 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
node简单实现一个更改头像功能的示例
Dec 29 Javascript
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
Aug 21 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
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
AngularJS 指令详细介绍
2016/07/27 Javascript
简单实现js浮动框
2016/12/13 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
python学生管理系统开发
2019/01/30 Python
python下载微信公众号相关文章
2019/02/26 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
IRO美国官网:法国服装品牌
2018/03/06 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
餐厅总厨求职信
2014/03/04 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
python操作xlsx格式文件并读取
2021/06/02 Python
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技