javaScript一种优化模式-初始化时分支

初始化时分支是一种优化模式。当知道某个条件在整个程序生命周期内都不会发生改变的时候,仅对该条件测试一次是很有意义的,浏览器嗅探(功能检测)就是一个典型的例子。

  1. 在发现XMLHttprequest可作为原生对象支持后,在程序执行过程中,底层的浏览器并没有机会改变,并且出乎意料您又需要处理AcitveX对象,由于环境并不会改变,代码就没有理由在每次需要另外一个XHR对象时继续保持嗅探。

2.查明DOM元素的计算样式或者附加的事件处理程序是另外一个可以受益于初始化时分支模式的场景。如下例子:

优化前:

var utils ={
    addListener:function(el,type,fn){
        if(typeof window.addEventListener ===‘function‘){
            el.addEventListener(type,fn,false);
        } else if(typeof document.attachEvent ===‘function‘){
            el.attachEvent(‘on‘+type,fn);
        } else{
            el[‘on‘+type]=fn;
        }
    },
    removeListener:function(el,type,fn){
        if(typeof window.removeEventListener ===‘function‘){
            el.removeEventListener(type,fn,false);
        } else if(typeof document.detachEvent ===‘function‘){
            el.detachEvent(‘on‘+type,fn);
        } else{
            el[‘on‘+type]=null;
        }

    }
};

上面这段代码效率比较低下,每次在调用 utils.addListener()或者 utils.removeListener()的时候,都会重复执行相同的检查,如果使用初始化时分支,可以在脚本初始化加载时候一次性探测出浏览器特征。此外,可以在整个页面生命周期内重定义函数的运行方式。如下:

var utils = {
    addListener:null,
    removeListener:null
};
if(typeof window.addEventListener ===‘function‘){
    utils.addListener=function(el,type,fn){
        el.addEventListener(type,fn,false);
    };
    utils.removeListener=function(el,type,fn){
        el.removeEventListener(type,fn,false);
    };
} else if(typeof document.attachEvent ===‘function‘){
    utils.addListener=function(el,type,fn){
        el.attachEvent(‘on‘+type,fn);
    };
    utils.removeListener=function(el,type,fn){
        el.detachEvent(‘on‘+type,fn);
    };

} else{
    utils.addListener=function(el,type,fn){
        el[‘on‘+type]=fn;
    };
    utils.removeListener=function(el,type,fn){
        el[‘on‘+type]=null;
    };
}

当使用这个模式时,请不要过度假设浏览器特征。

时间: 2024-10-12 11:33:11

javaScript一种优化模式-初始化时分支的相关文章

Oracle优化器和优化模式

Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行.分析语句的执行计划的工作是由优化器(Optimizer) 来完成的.不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的.相信你一定会用Pl/sql Developer.Toad等工具去看一个语句的执行计划,不过你可能对Rule.Choose.First rows.All rows这几项有疑问,因为我当初也是这样的,那时我也疑惑为什么选了以上的不同的项,执行计

JavaScript (JS) 函数补充 (含arguments、eval()、四种调用模式)

1. 程序异常 ① try-catch语法    测试异常 try-catch语法代码如下: try { 异常代码;     try中可以承重异常代码, console.log("try")  出现异常代码后,正确代码不会执行 } catch (e) { console.log("e:"+e);  try中出现异常在e中展现出来 console.log("catch");  只有try中出现异常才执行这段代码 } finally { consol

javaScript几种设计模式之一——单体模式

javaScript是一种弱类型.动态的.基于原型的语言,这种语言特性使得它非常容易. 甚至是普通的方式实现其中的一些模式. 单体模式的思想在于保证一个特定类仅有一个实例.这就意味着当您第二次使用同一个 类创建新对象的时候,应该得到与第一次所创建对象完全相同对象. 在javaScript中没有类,只有对象.当您创建一个新对象时,实际上没有其他对象与其 类似,因此新对象已经是单体了.使用对象字面量创建一个简单的对象也是一个单体的 例子. var obj ={ myprop:'my value' }

javascript中用来定义引用类型的一种"默认"模式

// 终极版:组合使用构造函数模式和原型模式:***************************** // 评价:集构造函数模式和原型模式之大成: 用来定义引用类型的一种默认模式 function Person(name, age, job){ //构造函数用来定义实例属性 this.name = name; this.age = age; this.job = job; this.friends = ["Shelby","Court"]; } Person.p

ios uiimage初始化时的两种方法

第一种方式:UIImage *image = [UIImage imageNamed:@"image"]; 使用这种方式,第一次读取的时候,先把这个图片存到缓存里,下次再使用时直接从缓存中读取:优点:只有第一次使用的时候稍慢,接下来在使用就会稍快:缺点:如果在当前工程中只使用一次会浪费内存. 第二种方式:initWithContentsOfFiles初始化时,每次都会根据路径去读取,不会占用内存,如果图片在当前工程中只使用一次,应该选择这个方法.

JavaScript中函数的四种调用模式

理解函数的四种调用方法,可以有效的帮助我们分析和理解JavaScript代码.但是经常有人分不清楚或者不理解这四种调用模式,在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C#或其他描述性语言那样仅仅作为一个模块来使用.函数有四种调用模式,分别是:1.函数调用形式 2.方法调用形式 3.构造器调用形式 4.上下文调用形式(apply,call)这里所有的调用模式中,最主要的区别在于关键字 this 的意义.下面分别介绍这几种调用形式. 一.函数调用形式

Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化

Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomcat7或以下,在Linux系统中默认使用这种方式. NIO: 利用Java的异步IO处理,可以通过少量的线程处理大量的请求. Tomcat8在Linux系统中默认使用这种方式. Tomcat7必须修改Connector配置来启动: <Connector port="8080" pro

浅谈人们工作时存在的2种思维模式

工作的思维模式分2种:即时回报型和延时回报型. 即时回报型的表现:注重立刻见效的方式,比如刀钝了舍不得花时间磨,提刀急忙去砍柴:比如每天都大老远的去提水,而舍不得花时间和钱去修条水管:比如工作上遇到难题了,直接上网搜答案,而舍不得花时间从基础学起:比如执行某个软件操作时舍不得花时间去找快捷键,每次都从菜单里点. 相对的是延时回报式,表现为:刀钝了就先去磨刀,磨快了再去砍柴:修水管而不是去提水:学习先从基础的开始:注意使用快捷键. 表现远远不止这些.从表面上看,即时回报的方式短期见效快,长期效率差

Tomcat Connector三种执行模式(BIO, NIO, APR)的比較和优化

Tomcat Connector的三种不同的执行模式性能相差非常大,有人測试过的结果例如以下: 这三种模式的不同之处例如以下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomcat7或下面,在Linux系统中默认使用这样的方式. NIO: 利用Java的异步IO处理.能够通过少量的线程处理大量的请求. Tomcat8在Linux系统中默认使用这样的方式. Tomcat7必须改动Connector配置来启动: <Connector port="8080&qu