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

  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;};
}

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

javaScript一种优化模式-初始化时分支相关推荐

  1. Javascript四种调用模式中的this指向

    第一种:函数直接调用执行的模式 function add(a,b){ console.log(this); return a+b; } add(1,2) //this===window 这里的this ...

  2. mysql rbo cbo_Oracle的RBO和CBO详细介绍和优化模式设置方法

    Oracle的优化器有两种优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CB ...

  3. JavaScript高级第2天:定义函数的三种方式、函数的原型链结构、完整原型链、作用域以及作用域链、函数的四种调用模式、闭包、计数器、斐波那契数列优化、三种继承方式

    JavaScript高级第二天 01-定义函数的三种方式 1.函数声明 function:可以先调用再声明,因为预解析(把函数声明.变量声明进行提升) function fn() {//函数体conl ...

  4. [译] JavaScript 的函数式编程是一种反模式

    本文讲的是[译] JavaScript 的函数式编程是一种反模式, 原文地址:Functional programming in JavaScript is an antipattern 原文作者:A ...

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

    javaScript是一种弱类型.动态的.基于原型的语言,这种语言特性使得它非常容易. 甚至是普通的方式实现其中的一些模式. 单体模式的思想在于保证一个特定类仅有一个实例.这就意味着当您第二次使用同一 ...

  6. 【转】JavaScript中的this关键字使用的四种调用模式

    http://blog.csdn.net/itpinpai/article/details/51004266 this关键字 本意:这个.这里的意思. 在JavaScript中是指每一个方法或函数都会 ...

  7. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  8. JavaScript中函数四种调用模式

    目录 JS中函数的四种调用模式 函数调用模式 方法调用模式 构造器调用模式 上下文调用模式 JS中函数的四种调用模式 在函数的调用模式中感觉最大的区别就是: this指向 函数调用模式 即通过函数名直 ...

  9. 神技巧!在Python类初始化时进行四种暗箱操作!

    Python 的类中,所有以双下划线__包起来的方法,叫魔术方法,魔术方法在类或对象的某些事件发出后可以自动执行,让类具有神奇的魔力,比如常见的构造方法__new__.初始化方法__init__.析构 ...

最新文章

  1. Python 3 利用 subprocess 实现管道( pipe )交互操作读/写通信
  2. Android Permission(授权)大全
  3. 搜索(DFS)---好友关系的连通分量数目
  4. 10个Linux 系统性能监控命令行工具
  5. Acoustic Echo Cancellation (AEC) 回音消除技术探索
  6. 东莞城院c语言上机报告,浙大城市学院c语言上机试题
  7. 华为鸿蒙系统英语报纸_华为鸿蒙英文不是Hongmeng OS?余承东解释
  8. 服务器内部错误_阿里云服务器被CC攻击怎么办
  9. 串级控制系统matlab仿真,锅炉串级三冲量给水控制系统的MATLAB 仿真
  10. 【整理】一个真实的图灵:如迷的解谜者,并非万事成谜
  11. 英语谚语大全(3267条)
  12. vue 使用vue-canvas-poster生成自定义海报
  13. android 抠图功能吗,抠图宝(抠图宝.和图)V10.01 安卓版
  14. Unix下 压缩和解压缩命令
  15. 杭电ACM2075题
  16. 富文本编辑器tinymce 自定义中文字号(四号,小四,五号,小五等)
  17. 区块链幸运哈希游戏哈希算法共享
  18. httpclient4 请一定设置超时时间
  19. Adobe Premiere // Adobe After Effects简称“AE”是Adobe公司推出的
  20. 推荐一款轻量化、易用的css框架bulma.css

热门文章

  1. python读取doc文件_Linux 下Python 读取Word文档内容的方法
  2. 整活插件 炉石传说_炉石传说:国服再搞大动作?官方插件神秘新功能压力测试开启...
  3. aptitude安装出现依赖_据说 pip install 今年将出现重大变化!
  4. android安全补丁卸载,这种安全更新能不卸载就不卸载
  5. 华为鸿蒙系统学习笔记2-生态系统介绍
  6. java oop入门_java入门(十六) | OOP(三)之构造方法
  7. php 统计二维数组次数最多_前端面试题(数组篇)
  8. .NetCore中三种注入方式的思考
  9. scrapy再学习与第二个实例
  10. Nginx+Lua+Redis 对请求进行限制