JS编程模式之初始化分支与惰性初始
不同的浏览器对于相同或相似的方法可能有不同的实现。这时,您需要依据当前的浏览器的支持方法来选择对应的执行分支。这类分支有可能与很多,因此可能会减缓脚本的执行速度。但非要等到运行时才能分支吗?我们完全可以在加载脚本时,在模块初始化的过程中就将部分代码进行分支处理。这显然更有利于提高效率。利用Javascript代码可以动态定义的特性,我们可以为不同的浏览器定制不同的实现方法,下面我们以定义事件处理程序举例:
初始化分支:
var MYAPP = {};
MYAPP.event = {
addListener: null, //事后可能会被赋值为对象或函数的变量,都应该初始为null
removeListener: null
};
//当脚本执行时,我们主动去执行分支,而不是等到用到事件处理时候
if (window.addEventListener) { //支持addEventListener的浏览器
MYAPP.event.addListener = function (el, type, fn) {
el.addEventListener(type, fn, false);
};
MYAPP.event.removeListener = function (el, type, fn) {
el.removeEventListener(type, fn, false);
};
} else if (document.attachEvent) { //IE
MYAPP.event.addListener = function (el, type, fn) {
el.attachEvent("on"+type, fn);
};
MYAPP.event.removeListener = function (el, type, fn) {
el.detachEvent("on"+type, fn);
};
} else { //older browsers
MYAPP.event.addListener = function (el, type, fn) {
el["on"+type]=fn;
};
MYAPP.event.removeListener = function (el, type, fn) {
el["on"+type]=null;
};
}
惰性初始:
惰性初始模式与上面的初始化分支模式很相似。不同之处在于,该模式下的分支只有在相关函数第一次被调用时才会发生-----即只有函数被调用时,它才会以最佳实现改写自己。
var MYAPP = {};
MYAPP.event = {
addListener: function (el, type, fn) {
//无论触发哪个条件,都会重写MYAPP.event.addListener方法
if (el.addEventListener) {
MYAPP.event.addListener = function (el, type, fn) {
el.addEventListener(type, fn, false);
};
} else if (el.attachEvent) {
MYAPP.event.addListener = function (el, type, fn) {
el.attachEvent("on"+type, fn);
};
} else {
MYAPP.event.addListener = function (el, type, fn) {
el["on"+type]=fn;
};
}
//注意,前面只是在第一次调用函数时,函数被重写了,注意“调用”二字,但是目前为止我们还没执行函数,所以最后要执行以下
MYAPP.event.addListener(el, type, fn);
}
};
JS编程模式之初始化分支与惰性初始的更多相关文章
- javascript常见编程模式举例
近期买到手了一本<javascript框架设计>,具体介绍开发js框架所用到的知识.初读一点,乐帝脆弱的理论修养就暴露无遗了,所以专门加强理论修养,重看javascript编程模式的举例. ...
- Javascript编程模式(JavaScript Programming Patterns)Part 2.(高级篇)
模块编程模式的启示(Revealing Module Pattern) 客户端对象(Custom Objects) 懒函数定义(Lazy Function Definition) Christian ...
- JS编程最佳实践
最近花了一周时间把<编写可维护的js> 阅读了一遍, 现将全书提到的JS编程最佳实践总结如下, 已追来者! 1.return 之后不可直接换行, 否则会导致ASI(自动分号插入机制)会在r ...
- 面向对象的js编程 Call和apply方法
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.arg ...
- JS编程常识
一.UI层的松耦合 松耦合就是要求各层遵循“最少知识原则”,或者说是各层各司其职,不要越权: HTML:结构层 CSS:表现层 JS:行为层 对于各层的职能,有一句比较贴切的解释:HTML是名词(n) ...
- CUDA 标准编程模式
前言 本文将介绍 CUDA 编程的基本模式,所有 CUDA 程序都基于此模式编写,即使是调用库,库的底层也是这个模式实现的. 模式描述 1. 定义需要在 device 端执行的核函数.( 函数声明前加 ...
- 利用MVC编程模式-开发一个简易记事本app
学了极客学院一个开发记事本的课程,利用自己对MVC编程模式的简单理解重写了一遍该app. github地址:https://github.com/morningsky/MyNote MVC即,模型(m ...
- Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)
JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...
- JAVA学习篇--JAVA两种编程模式控制
在Drp项目中,解说了两种编程模式Model 1和Model2.以下是对这两种模式的简单理解.以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下. ...
随机推荐
- CImage得到位图的大小
CImage image; image.Load(_T("1.jpg")); //HBITMAP hBitmap=image.Detach(); HGLOBAL m_hMem = ...
- python动态爬取网页
简介 有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得. 这说明我们想要的元素是在我 ...
- 12个有趣的c语言面试题
1.gets()函数 问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets ...
- 斯坦福CS229机器学习课程笔记 part2:分类和逻辑回归 Classificatiion and logistic regression
Logistic Regression 逻辑回归 1.模型 逻辑回归解决的是分类问题,并且是二元分类问题(binary classification),y只有0,1两个取值.对于分类问题使用线性回归不 ...
- Spring总结八:jdbcTemplate的简单使用
简介: Srping毕竟是一站式框架,所以也有操作数据库的东西,那就是jdbcTemplate,介绍一下jdbcTemplate的简单使用. 除了要引入必要的包以外,还需要引入 spring-jdbc ...
- Express+MySQL
初识NodeJS服务端开发(Express+MySQL) http://www.tuicool.com/articles/JfqYN3I 浅析node连接数据库(express+mysql) http ...
- Docker学习笔记_创建和使用Centos容器
实验:创建和使用Centos容器 步骤: 1.搜索 sudo docker search cen ...
- 面试题:各大公司Java后端开发面试题总结 已看1 背1 有用 链接有必要看看
ThreadLocal(线程变量副本) --整理 Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量. 采用空间换时间,它用于线程间的数据隔离,为每一个 ...
- scrapy设置代理
在爬取网站内容的时候,最常遇到的问题是:网站对IP有限制,会有防抓取功能,最好的办法就是IP轮换抓取(加代理) 下面来说一下Scrapy如何配置代理,进行抓取 1.在Scrapy工程下新建“middl ...
- Tomcat 与 数据库连接池 的小坑
连接池的优点众所周知. 我们可以自己实现数据库连接池,也可引入实现数据库连接池的jar包,按要求进行配置后直接使用. 关于这方面的资料,好多dalao博客上记录的都是旧版本Tomcat的配置方式,很可 ...