避免双重求值

有四个标准函数可以允许你传入代码的字符串,然后它才你动态执行。它们分别是: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. .NET CLR 运行原理

    原文: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects 文章讨论了: SystemDoma ...

  2. HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子

    前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...

  3. mysql full text全文索引必要条件

    show variables like 'ft_m%' 'ft_max_word_len', '84''ft_min_word_len', '4' 对于英文来说, ft_min_word_len=4是 ...

  4. Android回调

    当A页面跳往B页面做一些操作后,再从B页面回到A页面时,A页面想要回去一些B页面操作的数据时,我们一般会使用回调. 1 public class MainActivity extends Activi ...

  5. python 2.7 简单模拟登陆网站

    举个栗子,首先创建网络会话, 然后就可以用创建的session来访问网页了. session.get(URL) #-*- coding:utf-8 -*- import requests import ...

  6. golang: 把sql结果集以json格式输出

    func getJSON(sqlString string) (string, error) { stmt, err := db.Prepare(sqlString) if err != nil { ...

  7. ios8调用相机报警告: Snapshotting a view that has not been rendered results in an empty snapshot. Ensure you(转)

    我这也报了这个警告,但按他的方法并没有起作用,把写到这个地方看是否其他人用的到 错误代码:Snapshotting a view that has not been rendered results ...

  8. iOS开发小技巧--学会包装控件(有些view的位置由于代码或系统原因,位置或者尺寸不容易修改或者容易受外界影响)

    一.百思项目中遇到了两处这样的问题, 第一处 - 是评论界面的headerView,由于直接把自己搞的xib加载了放在了那里,xib中setFrame写了好多-=  +=,每次滚动的时候,会频繁调用x ...

  9. 【CodeVS 1582】【SDOI 2009】E和D

    http://codevs.cn/problem/1582/ 首先我打了一张50*50的表(4用#代替) 并没有发现什么规律! 然后观察题解可得,我观察的是TimeMachine学长的题解 什么得到s ...

  10. 【BZOJ 1568】【JSOI 2008】Blue Mary开公司

    经典的splay维护凸壳,但是看了看zky学长的题解最后决定写线段树维护标记永久化. Round1考到了这个之后一直没有理解标记永久化,CTSC也因为自己的缺陷丢掉了一些部分分,so sad 看来以后 ...