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 相关文章推荐
用脚本调用样式的几种方法
Dec 09 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
Jun 05 Javascript
js动态给table添加/删除tr的方法
Aug 02 Javascript
js加载读取内容及显示与隐藏div示例
Feb 13 Javascript
JavaScript中匿名、命名函数的性能测试
Sep 04 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
jQuery添加和删除输入文本框标签代码
May 20 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
Sep 25 Javascript
JavaScript中EventBus实现对象之间通信
Oct 18 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
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
PHP反射API示例分享
2016/10/08 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
python3对接mysql数据库实例详解
2019/04/30 Python
python 安装impala包步骤
2020/03/28 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
《草原》教学反思
2014/02/15 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
颁奖典礼主持词
2014/03/25 职场文书
《海底世界》教学反思
2014/04/16 职场文书
文化建设工作方案
2014/05/12 职场文书
团代会开幕词
2015/01/28 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
《三国志》赏析
2019/08/27 职场文书