Javascript 严格模式详解(上)

ECMAScript 5最早引进了“严格模式”(strict mode)的概念。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。使用严格模式的好处是可以提早知道代码中存在的错误,及时捕获一些可能导致变成错误的ECMAScript行为。支持严格模式的浏览器包括IE 10+,Firefox 4+,Safari 5.1+和Chrome。

1.   选择使用

要进入严格模式,可以使用严格模式的编译指示(pragma)

“use strict”;

如果是在全局作用域中(函数外部)给出这个编译指示,则整个脚本都将使用严格模式。

也可是只在函数中打开严格模式,就像下面这样:

function doSomething(){
       "use strict";
     //其他代码
}

如果你没有控制页面中所有脚本的权利,则只需要在测试的特定函数中开启严格模式。

2.   变量

在严格模式下,什么时候创建变量以及怎么创建变量都是有限制的。首先,不允许意外创建全局变量。在非严格模式下,可以像那这样创建全局变量:

//未声明变量
//非严格模式:创建全局变量
//严格模式:抛出ReferenceError

message="Hello World!";

即使message前面没有var关键字,即使没有将它定义为某个全局对象的属性,也能将message创建为全局变量。但在严格模式下,如果给一个没有声明的变量赋值,代码在执行时就会抛出ReferenceError。

其次,不能对变量调用delete操作符。非严格模式允许这样操作,但会静默失败。而在严格模式下,删除变量也会导致错误。

//删除变量
//非严格模式:静默失败
//严格模式:抛出ReferenceError

var color="red";
delete color;

严格模式下对变量名也有限制。特别的,不能使用implements,interface,let,package,private,protected,public,static和yield作为变量名。在严格模式下,用以上标识符作为变量名会导致语法错误。

3.对象

在严格模式下操作对象比在非严格模式下更容易导致错误。一般说来,非严格模式下会静默失败的情形,在严格模式下就会抛出错误。因此,在开发中使用严格模式会加大早发现错误的可能性。

在下列情形下操作对象的属性会导致错误:

  • 为只读属性赋值会抛出TypeError;
  • 对不可配置的(nonconfigurable)的属性使用delete操作符会抛出TypeError;
  • 为不可扩展的(nonextensible)的对象添加属性会抛出TypeError。

使用对象的另一个限制与通过对象字面量声明对象有关。在使用对象字面量时,属性名必须唯一。

例如:

//重名属性
//非严格模式:没有错误,以第二个属性为准
//严格模式:抛出语法错误

var person={
                name:"Nicholas",
                name:"Greg"
           };

4.    函数

首先,严格模式要求命名函数的参数必须唯一。以下面函数为例:

//重名参数
//非严格模式:没有错误,只能访问第二个参数
//严格模式:抛出语法错误

function sum(num,num){
                         //do sonmething
}

在非严格模式下,这个函数声明不会抛出错误。通过参数名只能访问第二个参数,要访问第一个参数必须通过arguments对象。

在严格模式下,arguments对象的行为也有所不同,在非严格模式下,修改命名参数的值也会反映到argument对象中,而严格模式下这两个值是完全独立的。例如:

//修改命名参数的值
//非严格模式:修改会反映到argument中
//严格模式:修改不会反映到argument中

function showValue(value){
       value="Foo";
       alert(value);             //"Foo"
       alert(argument[0]);  //非严格模式:"Foo"
                                    //严格模式:"Hi"
}

showValue("Hi");

另一个变化是淘汰了arguments.callee和arguments.caller。在非严格模式下,这两个属性一个引用函数本身,一个引用调用函数。而在严格模式下,访问哪个属性都会抛出TypeError。例如:

//访问arguments.callee
//非严格模式:没有问题
//严格模式:抛出TypeError

function factorial(num){
     if(num<=1){
              return;
     }else{
              return num*arguments.callee(num-1)
     }
}

var result=factorial(5);

类似的,尝试读写函数的caller属性,也会导致抛出TypeError。所以,对于上面的例子而言,访问factorial.caller也会抛出错误。

与变量类似,严格模式对函数名也做出了限制,不允许用implements,interface,let,package,private,protected,public,static和yield作为函数名。

对函数的最后一点限制,就是只能在脚本的顶级和在函数内部声明函数,也就是说,在if语句中声明函数会导致语法错误:

//在if语句中声明函数
//非严格模式:将函数提升到if语句外
//严格模式:抛出语法错误

if(true){
     function dosomething(){
               //.....
     }
}

在非严格模式下,以上代码能在所有浏览器中运行,但在严格模式下会导致语法错误。

时间: 2024-10-13 03:13:17

Javascript 严格模式详解(上)的相关文章

Javascript 严格模式详解

Javascript 严格模式详解 作者: 阮一峰 日期: 2013年1月14日 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度

Javascript 严格模式详解(转)

一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度: - 为未来新版本的Javascript做好铺垫. "严格模式&quo

[转]Javascript 严格模式详解

原文地址:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安

Javascript设计模式之装饰者模式详解篇

一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点:1. 在不改变原对象的原本结构的情况下进行功能添加.2. 装饰对象和原对象具有相同的接口,可以使客户以与原对象相同的方式使用装饰对象.3. 装饰对象中包含原对象的引用,即装饰对象是真正的原对象经过包装后的对象. 二.Javascript装饰者模式详解: 描述:装饰者模式中,可以在运行时动态添加附加功能到对象中.当

JavaScript对象类型详解

JavaScript对象类型详解 JavaScrtip有六种数据类型,一种复杂的数据类型(引用类型),即Object对象类型,还有五种简单的数据类型(原始类型):Number.String.Boolean.Undefined和Null.其中,最核心的类型就是对象类型了.同时要注意,简单类型都是不可变的,而对象类型是可变的. 什么是对象 一个对象是一组简单数据类型(有时是引用数据类型)的无序列表,被存储为一系列的名-值对(name-value pairs).这个列表中的每一项被称为 属性(如果是函

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

Extjs MVC开发模式详解

Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式,开始将一个JS(Extjs)应用程序分割成Model-View-Controller三层,为JS应用程序的如何组织代码指明了方向,同时使得大规模JS代码变得更加易于重用和维护:这就是Extjs MVC开发模式的初衷. 在官方给出的MVC例子中,我们可以看到一个简单的列表编辑功能,这篇文章就围绕这个功能进

JavaScript 运行机制详解

JavaScript 运行机制详解——转载: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另