JavaScript严谨模式(Strict Mode)提升开发效率和质量(转载)
随着WebApp突飞猛进的发展,Javascript写的WebApp规模越来月庞大,比如典型的代表产品腾讯WebQQ、HTML5游戏等等,Javascript越来越需要大量的开发人员多多人协作开发。同时HTML5、CSS3等新技术和NodeJs项目的高速发展,这几年JavaScript语言借着各种新API陆续被运用到从移动设备到服务器的多个”新领域”中。
但JavaScript语言自身由于ECMAScript第四版被放弃而一直没有多少改进。和借HTML5之名过度宣传的各种新API相比,语法层面通过严格模式(Strict Mode)进行的改进几乎可以用不为人知来形容。学习了解严格模式之后,就算不马上进行实践,也会让我们对JavaScript中坏气味的一方面有更清晰的认识,从而帮助我们写出更好的代码。
下面的内容翻译自It’s time to start using JavaScript strict mode,作者Nicholas C.Zakas参与了YUI框架的开发,并撰写了多本前端技术书籍,在我看过关于JavaScript严格模式的入门介绍文章中,这篇是写得最好的。
ECMAScript5中引入的严格模式,通过让JavaScript运行环境对一些开发过程中最常见和不易发现的错误做出和当前不同的处理,来让开发者拥有一个”更好”的JavaScript语言。很长一段时间内,由于只有Firefox支持严格模式,我曾对严格模式表示怀疑。但到了今天,所有主流的浏览器都在他们的最新版本中支持了严格模式(包括IE10,Opera12和Android4,IOS5)是时候开始使用严格模式了。
严格模式能起到什么作用?
严格模式为JavaScript引入了很多变化,我把他们分为两类(明显的和细微的)。细微改进的目标是修复当前JavaScript中的一些细节问题,对于这些问题我不在这里进行深入介绍;如果你有兴趣,请阅读Dmitry Soshnikov撰写的精彩文档ECMA-262-5 in Detail Chapter 2 Strict Mode。 我在这里主要介绍严格模式引入的明显变化,那些在你使用严格模式前应该知道的概念和那些对你帮助最大的改变。
在开始学习具体特性前,请记住严格模式的一大目标是让你能更快更方便的调试。运行环境在发现问题时显性的抛出错误比默不做声的失败或怪异行事(未开启严格模式的JavaScript运行环境经常这样)要好。严格模式会抛出更多错误,但这是好事,因为这些错误会唤起你注意并修复很多以前很难被发现的潜在问题。
去除WITH关键词
首先,严格模式中去除了with语句,包含with语句的代码在严格模式中会抛出异常。所以使用严格模式的第一步:确保你的代码中没有使用with。
// 在严格模式中以下JavaScript代码会抛出错误 with (location) { alert(href); }
防止意外为全局变量赋值
其次,局部变量在赋值前必须先进行申明。在启用严格模式之前,为一个未申明的局部变量复制时会自动创建一个同名全局变量。这是Javacript程序中最容易出现的错误之一, 在严格模式中尝试这么做时会有显性的异常抛出。
// 严格模式下会抛出异常 (function() { someUndeclaredVar = "foo"; }());
函数中的THIS不再默认指向全局
严格模式中另一个重要的变化是函数中未被定义或为空( null or undefined)的this不在默认指向全局环境(global)。这会造成一些依赖函数中默认this行为的代码执行出错,例如:
window.color = "red"; function sayColor() { alert(this.color); } // 在strict模式中会报错, 如果不在严格模式中则提示 “red" sayColor(); // 在strict模式中会报错, 如果不在严格模式中则提示 “red" sayColor.call(null);
this在被赋值之前会一直保持为undefined,这意味着当一个构造函数在执行时,如果之前没有明确的new关键词,会抛出异常。
function Person(name) { this.name = name; } //在严格模式中会报错 var me = Person("Nicholas");
在上面的代码中,Person构造函数运行时因为之前没有new,函数中的this会保留为undefined, 由于你不能为undefined设置属性,上面的代码会抛出错误。 在非strict模式环境中,没有被复制的this会默认指向window全局变量,运行的结果将是意外的为window全局变量设置name属性。
防止重名
当编写大量代码时,对象属性和函数参数很容易一不小心被设置成一个重复的名字。严格模式在这种情况下会显性的抛出错误
//重复的变量名,在严格模式下会报错 function doSomething(value1, value2, value1) { //code } //重复的对象属性名,在严格模式下会报错: var object = { foo: "bar", foo: "baz" };
以上的代码在严格模式中都会被认为是语法错误而在执行前就让你能得到提示。
安全的 EVAL()
虽然eval()语句最终没有被移除,但在严格模式中仍然对它进行了一些改进。最大的改变是在eval()中执行的变量和函数申明不会直接在当前作用域中创建相应变量或函数,例如:
(function() { eval("var x = 10;"); // 非严格模式中,alert 10 // 严格模式中则因x未被定义而抛出异常, alert(x); }());
任何在eval()执行过程中创建的变量或者函数保留在eval()中。但你能明确的从eval()语句的返回值来获取eval()中的执行结果,例如:
(function() { var result = eval("var x = 10, y = 20; x + y"); // 在strict或非strict模式中都能正确的运行余下的语句.(resulst为30) alert(result); }());
对只读属性修改时抛出异常
ECMAScript5中还引入为对象的特定属性设为只读,或让整个对象不可修改的能力。 但在非严格模式中,尝试修改一个只读属性只会默不做声的失败。 在你和一些浏览器原生API打交道过程中,你很可能遇到这种情况。严格模式会在这种情况下明确的抛出异常,提醒你修改这个属性是不被允许的。
var person = {}; Object.defineProperty(person, "name" { writable: false, value: "Nicholas" }); // 在非严格模式时,沉默的失败,在严格模式则抛出异常. person.name = "John";
上面的例子中,name属性被设为只读,非严格模式中执行对name属性的修改不会引发报错,但修改不会成功。但严格模式则会明确的抛出异常。
NOTE: 强烈建议你在使用任何ECMAScript属性特性指定时开启严格模式。
如何使用?
在现代浏览器中开启严格模式非常容易,只需要在JavaScript代码中出现以下指令即可
"use strict";
虽然看上去上面的代码仅仅只是未赋予某个变量的字符串,它实际上起到指示JavaScript引擎切换到严格模式的作用(不支持严格模式的浏览器会忽略以上代码,不会对后续的执行产生任何影响)。虽然你能把这个指令作用到全局或某个函数中,但这里还是要提醒,不要在全局环境下启用严格模式。
// 请不要这么使用 "use strict"; function doSomething() { // 这部分代码会运行于严格模式 } function doSomethingElse() { // 这部分代码也会运行于严格模式 }
虽然上面的代码看起来不算一个大问题。但当你不负责维护页面中引入的全部代码时,这样使用strict模式会让你面临由于第三方代码没有为严格模式做好准备而引发的问题。
因此,最好把开启严格模式的指令作用于函数中,例如:
function doSomething() { "use strict"; // 这个函数中的代码将会运行于严格模式 } function doSomethingElse() { // 这个函数中代码不会运行于严格模式 }
如果你想让严格模式在不止一个函数中开启,请使用立即执行函数表达式 (immediately-invoked function expression ,IIFE):
(function() { "use strict"; function doSomething() { // 这个函数运行于严格模式 } function doSomethingElse() { // 这个函数同样运行于严格模式 } }());
结论
我强烈建议你从现在开始就启用JavaScript严格模式,它能帮你发现代码中未曾注意到的错误。不要在全局环境中启用,但你能尽量多的使用IIFE(立即执行函数表达式)来把严格模式作用到多个函数范围内。一开始,你会遇到之前未曾碰到过的错误提示,这是正常的。当启用严格模式后,请确保在支持的浏览器中做了测试,以发现新的潜在问题。一定不要仅仅在代码中添加一行”use strict”就假定余下的代码能正常工作。最后,请在严格模式下开始编写更好的代码。
相关推荐
包括ES6(ECMAScript 2015)及之后版本的新特性,如箭头函数、模板字符串、解构赋值、Promise等,这些新特性极大地提高了JavaScript的编程效率和代码可读性。 ### 教学资源与支持 为了更好地辅助读者学习,本书...
### JavaScript 规范详解 ...总之,理解和掌握JavaScript的作用域和作用域提升对于编写高质量的JavaScript代码至关重要。遵循上述的最佳实践,可以有效地避免全局命名空间污染、增强代码的健壮性和可维护性。
最后,了解并熟练运用各种JavaScript库和框架是提高开发效率的关键。React、Vue、Angular等框架提供了组件化开发模式,简化了大型Web应用的构建。jQuery则简化了DOM操作和事件处理,是许多传统项目中的得力工具。 ...
11. **ES新特性**:ES6至ES2022引入了许多新特性,如箭头函数、解构赋值、模板字符串、Set和Map、类与继承等,这些提升了JavaScript的表达力和开发效率。 12. **跨域通信**:CORS、JSONP和IFrame等技术用于解决...
本教程旨在帮助你快速掌握JavaScript的使用,无论是为了提升工作效率还是满足用户偏好,JavaScript都是现代Web开发不可或缺的一部分。 1. 选择JavaScript的原因 JavaScript之所以受到重视,首先是因为用户对B/S...
JavaScript的严格模式(strict mode)是对JavaScript编程的一种增强模式,旨在消除语言中的一些不安全、不合理和不严谨的特性,从而提升代码质量和安全性。在严格模式下,如果开发者违反了某些特定规则,JavaScript...
6. TypeScript:作为JavaScript的超集,TypeScript提供了静态类型检查,提升了代码的可维护性和开发效率,越来越多的项目开始采用TypeScript。 7. PWA(渐进式Web应用):利用Service Worker、Manifest等技术,...
15. **测试与调试**:单元测试、集成测试、断言库的使用,以及Chrome DevTools等开发工具的调试功能,都是提升开发效率和代码质量的重要手段。 这本书的源代码部分将提供配套的实例,帮助读者更好地理解和应用书中...
此外,JavaScript中存在变量提升(hoisting)现象,即函数声明和变量声明会被提升到当前作用域的顶部,这意味着在使用变量之前进行声明是非常重要的。 4. 使用严格模式 通过使用"use strict"指令,JavaScript代码...
理解和运用正则表达式是提高代码效率的关键。 这个压缩包里的22本书籍涵盖了Web开发的各个方面,无论是初学者还是经验丰富的开发者,都可以从中受益。学习这些内容,能够帮助你理解Web的工作原理,提升开发技能,并...
此外,书中可能还会涵盖Web开发工具的使用、调试技巧、响应式设计、以及如何利用现代框架如React、Vue或Angular进一步提升开发效率。对于想要进入Web开发领域的初学者,这是一本不可多得的经典教材。
6. 工具链支持:可能包括了IDE插件、代码格式化器、静态分析工具等,以提升开发效率。 7. 异步编程工具:JavaScript中的异步编程常使用回调、Promise或async/await,此Shell可能对此有优化,提供更优雅的异步处理...
总结来说,基于B/S/S模式的电子政务系统设计与实现,旨在通过现代信息技术优化政府工作流程,提升公共服务质量,同时保证系统的安全性和稳定性。这种模式的采用,有助于推动政府信息化进程,提升政府的管理水平和...
JavaScript中的“严格模式”(Strict Mode)是ECMAScript 5引入的一个重要特性,它的目的是为了改进JavaScript语言的规范,消除一些旧版本中不合理、不严谨的语法特性,提高代码的安全性和性能,并为后续版本的...
根据提供的文件信息,可以总结出如下知识点: 1. TypeScript介绍:TypeScript 是一种由微软开发的开源...通过学习和使用TypeScript,开发者将能够在前端领域中拥有更多的表达方式和工具,以提高开发效率和代码质量。
这样的框架可以帮助开发者快速构建现代Web应用,提供一致的用户体验,并且由于TypeScript的引入,能降低代码出错的概率,提高开发效率。 【Monorepo开发模式】 "yike-design-dev_monorepo-dev.zip"的文件名暗示了...
13. **前端架构和混合开发框架**:熟悉vue等主流前端架构,以及hbuilder、uni-app、H5+、mui等混合开发工具,能够提高开发效率和项目质量。 总之,北京计算机软件行业的前端岗位要求开发者具备扎实的技术基础,丰富...
在JavaScript的世界里,选择合适的库或框架对于提升开发效率和代码质量至关重要。Dojo和jQuery是两个备受关注的JavaScript库,它们各自具有独特的特性和优势。这篇文章将对这两个工具进行深入比较,帮助开发者理解...
Java是一种广泛使用的面向对象的编程语言,而脚本语言则以它们的轻量级、解释执行和快速开发特性而闻名。两者在软件开发领域中...通过学习这些内容,开发者可以更好地理解和利用这两种技术,提高开发效率和项目质量。