避免双重求值

有四个标准函数可以允许你传入代码的字符串,然后它才你动态执行。它们分别是:eval、Function、setTimeout、setInterval

事实上当你在javascript代码中执行另外一段javascript代码时,都会导致双重求值的性能消耗,所以在大多数情况下,没必要使得eval和Function函数,因此最好避免使用它们。至于setTimeout和setInterval,建议传入函数而不是字符串来作为第一个参数

现在Safari4和chrome的javaScript引擎会缓存住那些使用了eval且重复运行的代码,这也是一个性能提升点。

使用Object/Array直接量

使用直接量的两大好处

  1. 运行速度更快
  2. 节省代码量、减少文件尺寸(事实上对象属性或者数组项数量越多,使用直接量的好处就越明显)

不要重复工作

有两种方法避免重复工作

  1. 延迟加载
  2. 条件预加载

以一个例子来说明吧

        function addHandler(target,eventType,handler) {
if (target.addEventListener) {//DOM2 Events
target.addEventListener(eventType, handler, false);
} else {//IE
target.attachEvent('on' + eventType, handler);
}
}
function removeHandler(target, eventType, handler) {
if (target.removeEventListener) {//DOM2 Events
target.removeEventListener(eventType, handler, false);
} else {//IE
target.detachEvent('on' + eventType, handler);
}
}

事实上页面一加载,你就知道用户是使用的哪种浏览器,但是这时候如果页面上有100个元素需要添加事件绑定就需要判断100次(而本身事实上你只需要去判断一次)

下面使用延迟加载的方式来试试

        function addHandler(target, eventType, handler) {
if (target.addEventListener) {//DOM2 Events
addHandler = function (target, eventType, handler) {
target.addEventListener(eventType, handler, false);
}
} else {//IE
addHandler = function (target, eventType, handler) {
target.attachEvent('on' + eventType, handler);
}
}
addHandler(target, eventType, handler);//调用新的函数
}
function removeHandler(target, eventType, handler) {
if (target.removeEventListener) {//DOM2 Events
removeHandler = function (target, eventType, handler) {
target.removeEventListener(eventType, handler, false);
}
} else {//IE
removeHandler = function (target, eventType, handler) {
target.detachEvent('on' + eventType, handler);
}
}
removeHandler(target, eventType, handler);//调用新的函数
}

调用延迟加载函数时,第一次会相对慢些,后面每次调用时都会很快,所以当一个函数在页面中不会立即调用时,延迟加载是最好的选择

另外一种方式是使用条件预加载:会在脚本加载期间提单检测,而不会等到函数被调用

        var addHandler = document.body.addEventListener ?
function (target, eventType, handler) {
target.addEventListener(eventType, handler, false);
} :
function (target, eventType, handler) {
target.attachEvent('on' + eventType, handler);
}; var removeHandler = document.body.removeEventListener ?
function (target, eventType, handler) {
target.removeEventListener(eventType, handler, false);
} :
function (target, eventType, handler) {
target.detachEvent('on' + eventType, handler);
};

位操作

javascript中的数字都是以64位格式进行存储的,在位操作中,数字被转换为有符号32位格式,每次运算都是直接操作该32位数得到结果,事实上javascript位操作比其它数学运算和布尔运算操作都要快

举例来说明一下

1、对2取模,一般性的大家会如下这样写

        if (i % 2) {
//是奇数
} else {
//是偶数
}

但下面这样写会更快些

        if (i & 1) {
//是偶数
} else {
//是奇数
}

2、位掩码(也就是使用单个数字的每一位来判定是否选项成立,从而有效的把数字转换为由布尔值标记组成的数组)示例代码如下所示

        var OPTION_A = 1;
var OPTION_B=2;
var OPTION_C = 3;
var OPTION_D = 4;
var options = OPTION_A | OPTION_B | OPTION_C | OPTION_D;
if (options&OPTION_A) {
//选项a在列表中,进行处理processing
}
if (options & OPTION_B) {
//选项b在列表中,进行处理processing
}

使用原生方法

无论你的javascript如何优化,都不会比js引擎提供的原生方法更快,原因很简单这些原生方法在你写代码之前就已经存在浏览器中了,并且是使用低级语言写的,这就说明这些代码已经被编译成机器码成为浏览器的一部分了,启能不比你的代码快?

小结

高性能JavaScript笔记三(编程实践)的更多相关文章

  1. 高性能javascript笔记

    ----------------------------------------------------------- 第一章 加载和执行 ------------------------------ ...

  2. 《编写可维护的JavaScript》之编程实践

    最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...

  3. 高性能JavaScript之DOM编程

    我们知道.DOM是用于操作XML和HTML文档的应用程序接口,用脚本进行DOM操作的代价非常昂贵. 有个贴切的比喻.把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之 ...

  4. 高性能JavaScript(DOM编程)

    首先什么是DOM?为什么慢? DOM:文档对象模型,是一个独立于语言的,用于操作XML和HTML文档的程序接口(API) 用脚本进行DOM操作的代价很昂贵.那么,怎样才能提高程序的效率? 1.DOM访 ...

  5. 高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)

    写在前面 好的书,可能你第一遍并不能领会里面的精魂,当再次细细品评的时候,发现领悟的又是一层新的含义 (这段时间,工作上也不会像从前一样做起来毫不费力,开始有了新的挑战,现在的老大让我既佩服又嫉妒,但 ...

  6. 高性能Javascript(2) DOM编程

    第三部分 DOM编程 文档对象模型(DOM)是一个独立于语言的,使用XML和HTML文档操作的应用程序接口(API).在浏览器中,主要与HTML文档打交道,在网页应用中检索XML文档也很常见.DOM ...

  7. 高性能JavaScript笔记二(算法和流程控制、快速响应用户界面、Ajax)

    循环 在javaScript中的四种循环中(for.for-in.while.do-while),只有for-in循环比其它几种明显要慢,另外三种速度区别不大 有一点需要注意的是,javascript ...

  8. JavaScript笔记三两个

    JavaScript定义变量: var num;变量的类型不知道,当给num赋值后,根据值类型来确定类型. var num = 3; //数值类型 var str = "hello,worl ...

  9. 关于高性能javascript 笔记

    最近买了本新书,准备自己吃 狗粮的同时也吃点精神食粮.笔记总结,从现在开始,看我啥时候能看完这本酥,就酱紫, begin:

随机推荐

  1. 用c#操作Mongodb(附demo)

    因为需要,写了一个基于泛型的helper,这样要使用起来方便一点. 为了大家也不重复造轮子,所以发出来希望能帮到谁. 复杂的查询最好用linq,这也是mongodb官方建议的. mongodb的C#配 ...

  2. display:block、display:inline与displayinline:block的概念和区别

    总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...

  3. LINUX 配置IP

    1. 用命令查看一下IP配置:ifconfig, 修改网络配置文件  vi  /etc/sysconfig/network-scripts/ifcfg-eht0 2.但是,很多时候,较难记住里面文件的 ...

  4. 理解 Paxos

    Paxos是前段时间刚获得图灵奖的大神Leslie Lamport所提出的,是用来解决分布式系统中的一致性问题的算法.该算法对于分布式系统的重要性,在这里不再赘言.了解过Paxos的朋友应该都知道,要 ...

  5. [转]NullPointerException异常

    原文地址:http://blog.csdn.net/javaeeteacher/article/details/4285488 顾名思义,NullPointerException是空指针异常.但是在J ...

  6. ES6新特性:Proxy代理器

    ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...

  7. native2ascii 国际资源文件编码

    将common_zh_CN.properties 转换为 本地文件 common_zh_CN_src.properties native2ascii -reverse common_zh_CN.pro ...

  8. Maven-搭建maven web项目

    点击Eclipse菜单File->New->Other->Maven->Maven Project 在选择maven-archetype的界面进行如下操作:(其他选项基本与创建 ...

  9. Python列表、元组、字典和字符串的常用函数

    Python列表.元组.字典和字符串的常用函数 一.列表方法 1.ls.extend(object) 向列表ls中插入object中的每个元素,object可以是字符串,元组和列表(字符串“abc”中 ...

  10. 【BZOJ-1863】trouble 皇帝的烦恼 二分 + DP

    1863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 559  Solved: 295[Submit] ...