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 相关文章推荐
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
jquery命令汇总,方便使用jquery的朋友
Jun 26 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
js运动应用实例解析
Dec 28 Javascript
微信小程序 WebSocket详解及应用
Jan 21 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
Aug 27 Javascript
详解基于webpack&gettext的前端多语言方案
Jan 29 Javascript
jQuery实现验证用户登录
Dec 10 jQuery
小程序如何写动态标签的实现方法
Feb 05 Javascript
ES6新增的数组知识实例小结
May 23 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
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
js对象的复制继承实例
2015/01/10 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
社区中秋节活动方案
2014/01/29 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
学前班评语大全
2014/05/04 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技