最近在JavaScript性能方面有所感悟,把我的经验分给大家:

说到JavaScript,就不得不说它的代码的运行速度——

  在我初学JavaScript的时候,只是觉得它是一个很强大的脚本。渐渐的,在做一些大的网站的项目的时候,却发现,代码执行的却异常的慢(尽管JavaScript用的是V8引擎),任然不能满足我的需求。这时候,我才慢慢的关注性能这一名词。在以前,个人总是喜欢在网上搜一些好的插件,并把它用到网站的建设工作当中。那么问题来了,在大量的插件的使用当中,网页总是要运行很久,处于很长时间的空白,这时候我发现JavaScript执行代码的速度越来越慢。究其缘由,那就是网页在渲染的过程前,一直在执行JavaScript代码的编译,以至于让网页长时间处于空白状态。那么这种问题的来源是什么?怎么解决呢?

  在引用<script>标签的时候,我们习惯性的把它放在<head>标签之内。这样的做法,只是在最初接触JavaScript,或者说小的项目的时候可以这样做。个人觉得,做网页就是要很好的实现与用户的交互,如果像上述过程一样,用户长时间看的是一片空白的页面,会导致什么样的后果可想而知。为了提高JavaScript代码编译的运行速度,提升JavaScript的性能,(1)我推荐把<script>标签写在</body>之前,如果有很多的js,我建议用把包工具(雅虎YUI)合并一下.(2)在IE4+ Firefox3.5 的版本下,用代有defer的属性,像这样:<script defer></script> ,这样做的原理是让<script>标签总在onload事件执行前调用,原因不用深究。(3)动态的创建JavaScript (有兴趣的可以试试,不推荐)。

  下面说到一个很实用,又简单,提升JavaScript性能的方法:‘局部变量’

  这里必须要说一下在JavaScript里面,有四种数据存取位置:1.直接量 2.变量 3.数组元素 4.对象成员。

  通常来讲,我们可以通过把常用的对象成员、数组元素、跨域变量保存在局部变量中来改善JavaScript性能,因为局部变量访问的速度更快。为了便于理解,还是敲两段代码吧!

    function myLoop1(){

      for(var count=0;count<99999;count++){

        $('#idName').innerHTML + = 'A';

      }

     }

说明一下这段代码:每一次循环访问id是idName的元素时,该元素一共被访问了两次,一次是读取他的innerHTML,另一次是重写idName的值。

那么怎么才算提升性能的做法呢?看如下代码

    

 function myLoop2(){

      var show='';

      for(var count=0;count<99999;count++){

        show+ = 'A';

      }

      $('#idName').innerHTML += show;

     }

实验证明:在所有浏览器下,myLoop2的运行要比myLoop1,快几十倍,在IE6下,更是快155呗。

那么为什么这样做会快这么多呢。我简单解释一下:JavaScript实际上包括了ECMAScript、DOM、BOM,不要以为三者是和谐共处的,它们互相沟通可是要过“路费的”。所以,我们要尽可能的把运算留给ECMAScript这一端,减少访问DOM的次数。

以后还有性能方面的问题还会分享给大家,不喜勿喷哦!

浅谈JavaScript性能的更多相关文章

  1. 浅谈javascript性能-管理内存

    上次说到,javascript脚本到底应该放在哪里?用什么用处? 以下2点: 在Html.Body部分中的JS会在页面加载的时候执行.即-用户触发一个事件的时候执行的脚本.eg:onload事件... ...

  2. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  3. 浅谈DOM性能考虑

    浅谈DOM性能考虑 很多人都会忽视脚本对Web应用整体性能的影响.为保证应用的流畅运行,在为文档编写和应用脚本时,需要注意一些问题.一.尽量减少访问DOM和尽量减少标记    访问DOM的方式对脚本性 ...

  4. 浅谈javascript的原型及原型链

    浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...

  5. 浅谈java性能分析

    浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...

  6. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  7. 浅谈JavaScript浮点数及其运算

    原文:浅谈JavaScript浮点数及其运算     JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...

  8. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

  9. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...

随机推荐

  1. String、StringBuffer和StringBuilder

    一.String和StringBuffer String类型和StringBuffer类型的主要性能差别事实上在于String是不可变的对象,因此在每次对String类型进行改变的时候事实上都等同于生 ...

  2. 人活系列Streetlights (秩)

    人活着系列之Streetlights Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 人活着假设是为了家庭,亲情----能够说是在这个世界上最温暖人心的, ...

  3. Eclipse SDK构建J2EE开发环境

    鄙视官Java EE Developers 体积庞大的兄弟们可以提出自己的J2EE开发环境! 1.第一次去Eclipse官网下载Eclipse IDE 我使用的是:Eclipse IDE for Ja ...

  4. 据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)

    首先要预购和序,以恢复它: 1.首先,我们使用的是递归的方式来完成 2.递归的最小单位:一个空的树和书的前言和第一序.该序列的第一个元素是树的第一序列根,调用这种方法 3.递归的终止条件是.当这棵树的 ...

  5. Android和C#实时视频传输Demo

    说起去年的Demo.以今天的免费整齐优势. 原理很easy,虽然没有写android申请书.但,好了~ 高级语言是相通的.傲慢约.就这么简单研究了一下api后,找到相机对象有一个预览回调方法. 意识到 ...

  6. MVC把随机产生的字符串转换为图片

    原文:MVC把随机产生的字符串转换为图片 Insus.NET在这篇中<在ASP.NET MVC应用程序中随机获取一个字符串>http://www.cnblogs.com/insus/p/3 ...

  7. 新秀系列C/C++经典问题(四)

    一个主题:查找最小的k个元素 输入n个整数.输出当中最小的k个. . 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数. 仅仅是这样的思路的时间复杂度为O(n ...

  8. CocoaPods停在Analyzing dependencies解决方案

    现在很多开源项目应用cocoapod.这使集成第三方库都非常方便,在没有花project里设置哪些参数.仗着. 只要运行pod update要么pod install时间,经常会卡在Analyzing ...

  9. Delegate,Action,Func,Predicate的使用与区别

    C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...

  10. MVC4 + EF为Model添加单独的验证属性

    可使用以下方式给Model加上相关的meta验证属性,这样实体的验证属性就不会被例如EF或其他工具自动生成的Model所替换了. using System.ComponentModel.DataAnn ...