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 相关文章推荐
推荐一些非常不错的javascript学习资源站点
Aug 29 Javascript
Jquery绑定事件(bind和live的区别介绍)
Aug 23 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 Javascript
JS两种定义方式的区别、内部原理
Nov 21 Javascript
验证控件与Button的OnClientClick事件详细解析
Dec 04 Javascript
js 加密压缩出现bug解决方案
Nov 25 Javascript
详解Javascript动态操作CSS
Dec 08 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
Jan 26 Javascript
RequireJS多页面应用实例分析
Jun 29 Javascript
详谈javascript精度问题与调整
Jul 08 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
Sep 19 Javascript
详解react-redux插件入门
Apr 19 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的autoLoad自动加载机制
2012/09/27 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
Laravel 5.5 异常处理 & 错误日志的解决
2019/10/17 PHP
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
事件绑定之小测试  onclick && addEventListener
2011/07/31 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
python的debug实用工具 pdb详解
2019/07/12 Python
美国糖果店:Sugarfina
2019/02/21 全球购物
internal修饰符起什么作用
2013/12/16 面试题
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
国家助学金获奖感言
2014/01/31 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python