`
虚怀若谷
  • 浏览: 9022 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多
JavaScript作为前端的看家本领,写出来的代码应该更加专业,更加高效。今天我来开个头,讲下JS性能方面的一些需要注意的地方。
JavaScript是一种解释型语言,所以无法达到和C/Java之类的水平,限制了它能在客户端所做的事情。但我们还是能做一些事情来提高它的性能的。JS的性能可以分为语言本身部分和非语言部分(比如DOM,XMLHttpRequest,Timer等)。
一、JS语言本身部分
1.多个变量一起声明,减少语句数量。
从理论上来说,一条句语句占用了一个CPU指令周期,所以语句数量少,必然会减少代码执行的时间。只是现在的计算机的运算能力都太快了,以至于感觉不出来这两种写法有什么区别,可以说几乎是没任何影响的。抛去时间这一点,从代码书写的专业程度来说,这一点是占了上风的。
2. Array -> [], Object -> {}, RegExp -> //
在声明数组,对象以及正则的时候,都建议采用以上写法,即使用直接量。它是由js引擎直接解释执行的,而不像new Array(),new Object(), new RegExp()会调用内部构造器。
3.避免使用eval和函数构造器
Eval is evil! 使用eval和函数构造器是很耗性能的,因为它每次都会调用js引擎把源代码转化成可执行代码。另外,eval里面的字符串环境是在运行期间才被解释的。
4.避免使用with
尽管看上去使用with挺方便的,但它会创建一个额外的代码scope,并且这个scope在编译期间是不知道的。
5.避免try{}catch(){}
不要养成动不动就使用try catch代码的习惯,有些时候是没必要的,就让错误抛出来吧。不过有些时候是需要的,比如后台传一个json字符串给前台转换,因为这个时候不知道后台传过来的字符串是否符合json格式的,这个时候又没很好的办法来检查,而且这个时候还得用eval语句,如果不符合格式,程序就出错了,导致别的代码无法执行下去,这个时候是不得不用了。这种情况,建议使用YUI的JSON包。
6.使用局部变量,避免全局变量
这一点在写代码的时候是需要非常谨慎的,因为一旦覆盖了别人声明的变量,后果肯定不堪设想的,特别是多人合作编写的代码,查起来也不容易。我建议都采用闭包形式,让我们的变量尽可能都成为局部变量。
7.如果一个变量或者方法在函数中使用多于1次,则用局部变量先进行保存,以减少变量look up的次数。
这个主要是缩短变量的范围链,不用每次使用都要向上查询。试想如果是全局变量,则每次都要向上查询到window对象为止,我们有理由相信这样是不明智的。这一点有些人说很极端,我却不是这么认为的。
8.巧妙地运用this
JS语言本身就博大精深,this的用法就能很好的体现。有一点需要记住的,this关键字总是指向当前函数的所有者对象(执行空间)s,如果没有明确的指出,就是window对象了。网上说这个的文章很多,建议有兴趣的同学好好研究一下。
9.使用JS原生的方法
我们有理由相信原生的方法肯定比外面再包一层的方法来得快。
10.采用好的算法,以减少时间复杂度。
这一点其实没啥好讲的,这又牵涉到计算机科学中很强大的一个方向:数据结构和算法。这个不是几句话,也不是我能讲得明白的。
11.运用正则,以减少代码复杂度。
这一点也没什么可讲的,正则运用得好的人,写出来的代码会很精简,但可读性会降低一点。正则也不是一天二天就能掌握的,需要日积月累。
12.需要的点还有很多很多,JS性能是一门很有学问的研究课题,需要大家乃至全世界的程序员们不断的挖掘和用实例去证明。这里我们得需要感谢那些努力研究JS语言的一线人员,正是他们的研究成果,才让我们能更好地认识这本强大的语言。

二、非语言部分,以Dom操作为例
1.减少dom操作。
随着ajax的流行,动态操作dom结点也是必然的。一个是用户体验的提升,一个是性能方面的下降,这是需要权衡的。单从性能来说,需要避免大容量的 dom操作。Dom一旦被更改,势必会引起repaint,repaint必然就导致了整棵dom树的reflow,从而影响了性能。但随着dom渲染引擎不断地强大,这个影响几乎可以忽略了。
2.优化dom结点的定位速度。
要想操作dom结点,首先是要定位到这个结点。定位结点有很多很多的方法。有一点需要注意的是,要尽量缩小查询的dom树范围,范围越小,查询速度必然更快。
3.缓存dom对象,争取做到只查询一次。
这一点要做到,是非常不容易的。只查询一次,势必要加大参数传递的频繁程度,这个直接会导致代码的复杂程度,这一点也是需要权衡一下的。
4.使用dom本身的一些已经优化过的方法,如innerHTML, cloneNode, DocumentFragment。
这些方法都是被很好的优化过的,但各种浏览器下面表现得不是很一致,需要实践后才知道,不要被网上一些人盲目的话给骗了,因为网上的文章基本是拷贝来拷贝去,有些文章是很早就写出来的,我们不用去怀疑它的正确性,但我们必须清楚它的适用范围,因为它很可能只是在讲IE浏览器。
5.避免在同一个对象上面重复添加事件
我觉得bug可以分为二种,一种是业务逻辑上的bug,这个就是我们日常所说的bug,还有一种是代码逻辑上的bug,在同一对象上面重复添加相同的事件,就是代码逻辑bug,虽然大多数的时候这可能看不出来有什么影响,但身为程序员,是需要注意的。
6.及时地移除已经用不到的事件
这一点很多人也不大会注意,如果这个事件已经用不到了,还是及时地移除吧,以引起不必要的麻烦。
7.event delegate
事件代理。这个的原理就是事件的冒泡原理,所以在不冒泡的事件中(如focus事件)就失效了。使用事件代理,能极大地减少dom树侦听的事件数量。我们有理由相信事件数量越少,dom对事件的响应速度会更快。
8.关于dom操作需要注意的地方真是太多太多了,不是一篇文章能说得完讲得清。很有可能,以上所说的点在新推出的浏览器上面已经不适用了,所以我们只有实践才能知道真相,平时多看网上别人的研究成果,以便不时之需。
总结:以上说得都很简洁,也没提供任何实例。提到的点也只是整个JS性能里面很小的一个子集,还有太多太多的东西等着我们去挖掘,我这里也只是抛砖引玉罢了。

记得Nicolas Zakas曾经说过前端工程师是所有程序员里面最复杂的工种之一,至今都很感谢这位前端大师级的人物来为我们前端工程师撑腰。每当工作感觉累的时候,我都会想起这句话,并且很欣慰。我们做出来的东西很可能被全世界的人看到,再累也是值得的。
2
0
分享到:
评论
3 楼 handy.wang 2010-07-17  
nice.
2 楼 danielwcai 2010-07-11  
写得不错!如果是原创的话。
1 楼 babydeed 2010-07-11  
好!支持一下!

相关推荐

    JavaScript学习(一)

    以上是JavaScript学习的初步内容,通过深入理解和实践这些知识点,开发者可以为后续进阶学习打下坚实基础。在学习过程中,结合实际项目练习,阅读文档和教程,参与社区讨论,将有助于快速提升JavaScript技能。

    VS2010_Javascript插件2015

    8. **性能分析**:提供JavaScript性能分析工具,帮助优化代码运行效率。 9. **版本控制集成**:与Git或其他版本控制系统集成,便于团队协作和代码管理。 10. **单元测试**:支持JavaScript单元测试框架,如Jasmine...

    javascript hover 特效网页

    在网页设计中,JavaScript是一种非常重要的脚本语言,它赋予了网页动态交互的能力。"hover"是CSS(层叠样式表)中的一...在实际开发过程中,需要考虑浏览器兼容性、性能优化等问题,确保特效在各种环境下都能流畅运行。

    angluo-javascript-341240.zip

    通常,这种文件可能包含了作者对于JavaScript的初步介绍,或者是对学习路径、关键知识点的引导。文本文件可能涵盖了JavaScript的基本语法,如变量声明(var、let、const)、数据类型(字符串、数字、布尔、null、...

    动态javaScript验证

    3. 防止恶意攻击:在用户提交数据前进行验证,可以初步过滤掉一些非法请求,提高系统安全性。 二、JavaScript验证基础 1. DOM操作:JavaScript可以通过Document Object Model (DOM)来操作HTML元素,获取用户输入,...

    个人博客开发案例(JavaScript).zip

    8. **性能优化**:JavaScript可以用于延迟加载、代码分割、图片懒加载等策略,以减少页面加载时间和提高性能。 9. **安全性**:尽管这个案例只包含前端部分,JavaScript仍然可以进行一些基本的安全措施,比如防止...

    javascript面向对象编程pdf

    通过这两个例子,读者可以初步体会JavaScript中实现OOP的方式。 JavaScript面向对象编程的实现,虽然在形式上有所不同,但在逻辑上与其他语言是相通的。开发者可以通过定义构造函数来创建对象的蓝图,然后通过new...

    JavaScript基础教程 ,适合初学者

    即使在性能较低的设备上,只需要一个文本编辑器和一个现代浏览器,就可以编写和运行JavaScript代码。它不需要复杂的开发环境,这使得初学者能够快速入门。同时,JavaScript是一种完整的编程语言,学习它可以为深入...

    Manning.Data.Wrangling.with.JavaScript.pdf

    - 这一阶段往往伴随着数据可视化和初步的数据分析,帮助开发者或数据科学家更深入地理解数据。 6. 数据清洗和准备 - 数据清洗是确保数据质量的重要步骤,涉及去除无关数据、修正错误、填充缺失值等。 - 数据准备...

    安卓与js初步交互

    通过以上步骤,开发者可以实现Android与JavaScript的初步交互,创建出既有原生应用性能,又有Web页面灵活性的混合式应用。在实际项目中,这通常用于实现复杂的功能,如分享、推送通知、地图服务等,提高开发效率和...

    Javascript教程--从入门到精通.doc

    1.4部分引导读者编写第一个简单的JavaScript程序,通过实际操作来初步接触这门语言。 深入学习,2.0章节围绕JavaScript的基本数据结构展开。2.1部分讲解如何在HTML文档中嵌入JavaScript代码,通过`<script>`标签将...

    关于JSP和JavaScript的探析

    - **客户端验证**: JavaScript可以在用户提交表单前进行初步验证,减少无效请求发送到服务器,节省网络带宽和服务器资源。 - **界面定制**: JavaScript可以用来改变网页的外观和行为,例如动态改变页面元素的位置...

    五日学会Javascript教程

    3. AJAX:初步接触异步编程,了解XMLHttpRequest和fetch API,实现简单的前后端数据交互。 第五天:ES6新特性及进阶话题 1. ES6新特性:包括let和const、解构赋值、模板字符串、箭头函数、类与模块等。 2. 异步编程...

    javascript网页开发-张孝祥_lesson6

    10. **性能优化**:了解JavaScript的运行机制,如事件循环和异步编程模型,可以帮助我们写出更高效的代码。我们将讨论如何减少DOM操作,优化代码结构,以及使用setTimeout和setInterval的正确方式。 通过本次课程的...

    JavaScript课程设计

    总的来说,JavaScript课程设计项目涵盖了JavaScript基础语法、DOM操作、CSS样式控制、网络请求、事件处理、前端框架应用以及性能优化等多个方面,是一个全面锻炼前端开发技能的实践平台。通过这个项目,学生不仅能够...

    javascript制作动画

    通过以上介绍,你应该对使用JavaScript制作动画有了初步了解。实践是学习的最佳途径,尝试创建自己的动画并不断优化,你会发现JavaScript动画的世界既富有挑战性又充满乐趣。记得分享你的作品,让更多人一起享受编程...

    javascript压缩工具

    结合以上知识,我们可以创建一个工作流程,先使用YUI压缩器对JavaScript文件进行初步压缩,然后通过服务器开启Gzip功能,进行第二次压缩。这样,既可以保持代码的可读性,又能最大限度地减小文件大小,提高加载速度...

    javascript经典特效---彩色渐变带.rar

    JavaScript是一种广泛应用于网页和应用程序的...在实际应用中,开发者可能会结合使用以上各种技术,根据项目需求来优化渐变效果,如性能、兼容性和用户体验。理解这些原理和方法将有助于你创建出更具吸引力的网页效果。

Global site tag (gtag.js) - Google Analytics