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 相关文章推荐
JS+JSP checkBox 全选具体实现
Jan 02 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
Jan 14 Javascript
jQuery+AJAX实现网页无刷新上传
Feb 22 Javascript
js仿百度切换皮肤功能(html+css)
Jul 10 Javascript
angular基于路由控制ui-router实现系统权限控制
Sep 27 Javascript
javascript中call,apply,bind函数用法示例
Dec 19 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
JavaScript使用面向对象实现的拖拽功能详解
Jun 12 Javascript
vue 使用外部JS与调用原生API操作示例
Dec 02 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 Javascript
小程序实现左滑删除的效果的实例代码
Oct 19 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 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
S900/ ETON E1-XM 收音机
2021/03/02 无线电
PHP多个版本的分析解释
2011/07/21 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
Python range与enumerate函数区别解析
2020/02/28 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
教师演讲稿范文
2014/01/08 职场文书
小学生期末自我鉴定
2014/01/19 职场文书
商务考察邀请函范文
2014/01/21 职场文书
2015年党小组工作总结
2015/05/26 职场文书
心理健康教育主题班会
2015/08/13 职场文书
JS实现简单九宫格抽奖
2022/06/28 Javascript