严格模式(Strict Mode)是ECMAScript5新增的功能。ECMAScript5虽然可以向后兼容ECMAScript3,但如果使用严格模式,哪些ECMAScript5“不在建议使用”的ECMAScript3语法功能将会被全部进制,如果出现就会抛出一行。引入Strict Mode目的是允许开发人员能够选择“更好”的Javascript版本,这个版本能用不同的方式处理那些普遍而又臭名昭著的错误。目前所有的主流浏览器的最新版本——包括IE10与Opera12——都支持严格模式。关于严格模式的大多数信息都可以在《ES5规范》[PDF]的第223页找到。
如何启用严格模式
可以在全局范围内使用严格模式,也可以在一个函数范围内使用严格模式。如果要再全局范围内启用严格模式,只需要在程序的第一行使用代码即可:
1 'use strict';
在函数的内部启用严格模式,只需要在函数体内第一行使用代码即可:
1 function imStrict(){ 2 'use strict'; 3 // ... 其他代码 ... 4 }
启用严格模式的语句只是一段普通的字符串“use strict”,没有任何新语法。这意味着不会对就旧式浏览器造成任何负面影响,因此可以大胆使用。
在函数内部启用严格模式的一个实际应用是,把整个Javascript类库定义在严格模式的函数内部,这样就可以不影响外部的代码:
1 (function(){ 2 "use strict"; 3 // Define your library strictly... 4 })();
严格模式带来了什么?
在开始介绍特殊特性之前,你需要记住,严格模式的目标之一是允许更快地调试错误。帮助开发者调试的最佳途径是当确定的问题发生时抛出相应的错误(throw errors when certain patterns occur),而不是悄无声息地失败或者表现出奇怪的行为(这正是如今不在严格模式下的Javascript做的)。严格模式下的代码抛出更多的错误信 息,这是好事,因为它能帮助开发者很快注意到一些必须立即解决的问题。
去除with语句(Eliminates with)
首先,严格模式去除了with语句。当with语句出现在严格模式中时,它会被认为是非法的Javascript语句并抛出语法错误。所以,使用严格模式的第一步就是确保你没有在使用with。
1 // 在严格模式中将导致语法错误 2 with(location){ 3 alert(href); 4 }
防止意外的全局变量(Prevents accidental globals)
第二点是,变量在赋值之前必须声明。在非严格模式下,给一个未声明的变量赋值将自动生成一个该名字的全局变量。这是Javascript中最普遍的错误之一。严格模式中,这样做将抛出一个错误。
1 // 严格模式中抛出一个错误 2 (function(){ 3 someUndeclaredVar ="foo"; 4 }());
取消this值的强制转换(Eliminates this coercion)
另一个重要的变化是,当this值为null或undefined时,不会再将其强制转换为全局对象。也就是说,this保留了它的原始值,也因此可能会导致一些依赖于强制转换的代码发生错误。例如:
1 window.color ="red"; 2 function sayColor(){ 3 // 严格模式下,this不会指向window 4 alert(this.color); 5 } 6 7 // 以下两种情况,在严格模式下都抛出错误 8 sayColor(); 9 sayColor.call(null);
根本而言,this值必须赋值,否则将保留undefined值。这意味着调用构造函数时若漏掉了new关键字也会导致错误:
1 functionPerson(name){ 2 this.name = name; 3 } 4 // 严格模式下导致错误 5 var me =Person("Nicholas");
在这段代码里,调用Person构造函数时缺少了new关键字,此时this值为undefined。由于你不能给undefined添加属性,这段代码抛出了一个错误。在非严格模式下,this会强制转换为全局对象,因此name属性能够被正确赋值为全局变量。
拒绝重复(No duplicates)
当你做了大量的编码的时候,你很容易在对象中定义了重复的属性或者给函数定义了重复的参数名。严格模式下,这两种情况都会导致错误的发生:
1 // 严格模式下错误 - 重复参数 2 function doSomething(value1, value2, value1){ 3 //code 4 } 5 6 // 严格模式下错误 - 重复属性 7 var object ={ 8 foo:"bar", 9 foo:"baz" 10 };
这两者都是语法错误,在代码执行之前将抛出错误。
更安全的eval()(Safer eval())
eval()没有被移除,但它在严格模式下发生了一些变化。最大的改变是:在eval()语句中声明的变量以及函数不会在包含域中创建。例如:
1 (function(){ 2 3 eval("var x = 10;"); 4 5 // 非严格模式下,x为10 6 // 严格模式下,x没有声明,抛出一个错误 7 alert(x); 8 9 }());
任意由eval()创建的变量或函数仍呆在eval()里。然而,你可以通过从eval()中返回一个值的方式实现值的传递:
1 (function(){ 2 3 var result =eval("var x = 10, y = 20; x + y"); 4 5 // 严格模式与非严格模式下都能正常工作(得到30) 6 alert(result); 7 8 }());
不可改变引发的错误(Errors for immutables)
ECMAScript 5 同时引入了修改属性特征的能力,例如设置一个属性为只读或者冻结整个对象的结构(freezing an entire object’s structure)。在非严格模式下,试图修改一个不可变的属性时将悄无声息地失败。你可能在使用一些原生APIs的时候已经遇到这类问题。严格模式将 保证无论你在何时试图使用一种不被允许的方式修改一个对象或对象的属性时抛出错误。
1 var person ={}; 2 Object.defineProperty(person,"name"{ 3 writable:false, 4 value:"Nicholas" 5 }); 6 7 // 非严格模式下将悄无声息地失败,严格模式则抛出错误 8 person.name ="John";
这个例子中,name属性被设置为只读。在非严格模式下,对name的赋值将悄无声息地失败;而在严格模式下,一个错误将被抛出。
注:如果你在使用ECMAScript属性能力(the ECMAScript attribute capabilities),我强烈推荐你开启严格模式。如果你在改变对象的可变性(mutability of objects),你将遇到一堆错误,而它们在非严格模式下将被安静地带过。
相关推荐
Javascript 严格模式详解
帮助理解JavaScript的严格模式,你必须要知道严格模式下JavaScript的一些要点,你必须要知道严格模式下JavaScript的一些要点,你必须要知道严格模式下JavaScript的一些要点,你必须要知道严格模式下JavaScript的一些...
javascript高级-javascript设计模式。视频文件(无加密可在线观看)
JavaScript设计模式.pdf
JavaScript设计模式+JavaScript模式+JavaScript异步编程,合计三本pdf文件,5分超值哦。
《JavaScript设计模式》是JavaScript设计模式的学习指南。全书分为14章。首先介绍了什么是模式、模式的结构、类别、模式的分类、如何编写模式等等;然后,集中介绍了很多流行的设计模式在JavaScript中的应用,包括...
在吃透了前面所说的书之后,接下来两本书的顺序已经无关紧要了,《JavaScript DOM高级程序设计》(注意和《JavaScript 高级程序设计》相区别)和《JavaScript设计模式》,这两本都是重量级的书,能让你的JS技术上一...
JavaScript设计模式与开发实践.pdf
JavaScript 设计模式(高清扫描版本)- 张容铭
严格模式(Strict Mode)是ECMAScript5新增的功能。ECMAScript5虽然可以向后兼容ECMAScript3,但如果使用严格模式,哪些ECMAScript5“不在建议使用”的ECMAScript3语法功能将会被全部进制,如果出现就会抛出一行。引入...
主要介绍了javascript严格模式详解(含严格模式与非严格模式的区别),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
作者针对常见的开发任务,从YUI等实战代码中取材,提供了专家级的解决方案,不仅透彻剖析了JavaScript扣的面向对象编程,而且深入探讨了如何用JavaScript实现以前只在服务器端应用的设计模式,如何根据实际场景选择...
JavaScript 1.8.5 英文第六章 JavaScript的严格模式与迭代迭代
为了帮助大家快速和较好地理解JavaScript设计模式中的单例模式,本文对JavaScript的单例模式进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。
一、概述 除了正常运行模式,ECMAscript 5添加了第二种运行...“严格模式”体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。 另一方面
本书在尊重《设计模式》原意的同时,针对JavaScript语言特性全面介绍了更适合JavaScript程序员的了16个常用的设计模式,讲解了JavaScript面向对象和函数式编程方面的基础知识,介绍了面向对象的设计原则及其在设计...
模式 JavaScript:基本概念 ECMAScript 5 JSLint Console 第2章 基本技巧 编写可维护的代码 尽量少用全局变量 for循环 for-in循环 不要增加内置的原型 SWitch模式 避免使用隐式类型转换 ...
深入讲解Javascript开发原理以及Javascript客户端脚本开发的设计模式,看完该书可以拓展WEB开发人员的Javascript开发的思路。
《JavaScript模式》将使用大量JavaScript编码模式和最佳实践来帮您回答该问题。如果您是一名有经验的开发者,正在寻找与对象、函数、继承以及其他特定语言分类,那么本书中的抽象方案和代码模板将是十分理想的指南,...