ECMAScript 5严格模式(Strict Mode)介绍

严格模式(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() { }语句在严格模式下是完全挂掉了。

(0)

相关推荐

  • Javascript的严格模式strict mode详细介绍

    "严格模式"(strict mode)是ECMA-262 Edition 5定义的新语法,表示要用严格的Javascript语法来执行,有一些过去惯用的写法就会抛出SyntaxError异常,例如:1.变量前没有用var宣告2.使用八进制语法:var n = 023和var s = "\047"3.使用with语句4.使用delete删除一个变量名(而不是属性名):delete myVariable5.使用eval或arguments作为变量名或函数名6.使用未来保

  • JavaScript严格模式use strict的介绍

    目录 1.概述 1.1严格模式是什么 1.2严格模式的目的 2.开启严格模式 2.1全局开启严格模式 2.2局部开启严格模式 3.严格模式中的变量 3.1禁止意外创建变量 3.2静默失败转为异常 3.3禁用delete关键字 3.4对变量名的限制 4.严格模式中的对象 4.1不可删除的属性 4.2只读属性的赋值 4.3不可扩展的对象 5.严格模式中的函数 5.1参数名必须唯一 5.2arguments的不同 5.3arguments.callee属性 5.4函数声明的限制 6.增加eval()作

  • MySQL模式 Strict Mode知识点详解

    I. Strict Mode阐述 根据 mysql5.0以上版本 strict mode (STRICT_TRANS_TABLES) 的限制: 1).不支持对not null字段插入null值 2).不支持对自增长字段插入''值,可插入null值 3).不支持 text 字段有默认值 看下面代码:(第一个字段为自增字段) Sql代码 $query="insert into demo values('','$firstname','$lastname','$sex')"; 上边代码只在非

  • mysql严格模式Strict Mode详细说明

    目录 1.开启与关闭Strict Mode方法 2.Strict Mode功能说明 3.例子: 1.not null字段插入null值测试 2.自增长字段插入”值测试 3.text字段默认值测试 总结 1.开启与关闭Strict Mode方法 找到mysql安装目录下的my.cnf(windows系统则是my.ini)文件 在sql_mode中加入STRICT_TRANS_TABLES则表示开启严格模式,如没有加入则表示非严格模式,修改后重启mysql即可 例如这就表示开启了严格模式: sql_

  • ECMAScript 5严格模式(Strict Mode)介绍

    严格模式(Strict Mode)是ECMAScript 5的新特性,它允许你把整个程序,或者某个函数,放置在"严格"的操作语境中.这种严格的语境会防止某些特定的操作并抛出更多的异常. 虽然ECMAScript 5对ECMAScript 3是向下兼容的,但是在严格模式下,所有在ECMAScript 3中不赞成使用的特性都被禁用(或抛出错误)而不是兼容. 启用严格模式有以下好处: 1.捕获一些编程错误,并抛出异常. 2.阻止进行一些相对"不安全"的操作(例如访问全局变

  • 深入理解javascript严格模式(Strict Mode)

    ECMAScript5中引入的严格模式,通过让JavaScript运行环境对一些开发过程中最常见和不易发现的错误做出和当前不同的处理,来让开发者拥有一个"更好"的JavaScript语言.很长一段时间内,由于只有Firefox支持严格模式,我曾对严格模式表示怀疑.但到了今天,所有主流的浏览器都在他们的最新版本中支持了严格模式(包括IE10,Opera12和Android4,IOS5)是时候开始使用严格模式了. 严格模式能起到什么作用? 严格模式为JavaScript引入了很多变化,我把

  • 在JavaScript中使用严格模式(Strict Mode)

    前言 ECMAScript5中引入的严格模式,通过让JavaScript运行环境对一些开发过程中最常见和不易发现的错误做出和当前不同的处理,来让开发者拥有一个"更好"的JavaScript语言.很长一段时间内,由于只有Firefox支持严格模式,我曾对严格模式表示怀疑.但到了今天,所有主流的浏览器都在他们的最新版本中支持了严格模式(包括IE10,Opera12和Android4,IOS5)是时候开始使用严格模式了. 严格模式能起到什么作用? 严格模式为JavaScript引入了很多变化

  • VMware网络连接模式(桥接、NAT以及仅主机模式的详细介绍和区别)

    在使用VMware Workstation(以下简称:VMware)创建虚拟机的过程中,配置虚拟机的网络连接是非常重要的一环,当我们为虚拟机配置网络连接时,我们可以看到如下图所示的几种网络连接模式:桥接模式.NAT模式.仅主机模式.自定义网络连接模式.那么这几种网络连接模式都各自有什么主要用途,它们之间又有哪些区别呢? 磨刀不误砍柴工,为了更好地使用虚拟机,了解这几种连接模式的主要用途以及它们之间的区别是非常有必要的.在这里,我们就以下面的网络连接示意图为例来进行相关介绍. 在VMware中,虚

  • IIS7.5应用程序池集成模式和经典模式的区别介绍

    在 IIS 7.5 中,应用程序池有两种运行模式:集成模式和经典模式. 应用程序池模式会影响服务器处理托管代码请求的方式. 如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求. 如果托管应用程序在采用经典模式的应用程序池中运行,服务器会继续通过 Aspnet_isapi.dll 路由托管代码请求,其处理请求的方式就像应用程序在 IIS 6.0 中运行一样. 经典模式: 指的是与IIS 6或者之前版本保持兼容的一种模式,一个典型

  • vue store之状态管理模式的详细介绍

    状态管理 一.状态管理(vuex)简介 uex是专为vue.js应用程序开发的状态管理模式.它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.vuex也集成刀vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试.状态快照导入导出等高级调试功能. Vuex 的思想 当我们在页面上点击一个按钮,它会处发(dispatch)一个action, action 随后会执行(commit)一个mutation, mut

随机推荐