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 相关文章推荐
图片完美缩放
Sep 07 Javascript
jquery 插件学习(四)
Aug 06 Javascript
jquery用data方法获取某个元素上的事件
Jun 23 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
小议JavaScript中Generator和Iterator的使用
Jul 29 Javascript
js将json格式的对象拼接成复杂的url参数方法
May 25 Javascript
详解vue.js数据传递以及数据分发slot
Jan 20 Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
Nov 18 jQuery
使用Vant完成DatetimePicker 日期的选择器操作
Nov 12 Javascript
js获取图片的base64编码并压缩
Dec 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
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
Python封装shell命令实例分析
2015/05/05 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
python实现图书管理系统
2018/03/12 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
python计算两个地址之间的距离方法
2018/06/09 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
班组长安全职责
2014/01/05 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
公司晚会主持词
2014/03/22 职场文书
蓝颜请假条
2014/04/11 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
python 模块重载的五种方法
2021/04/24 Python
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Java8中接口的新特性使用指南
2021/11/01 Java/Android
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL