javascript优化--05模式(函数)
回调函数模式:
- 基本例子:
var findNodes = function (callback) {
......................
if (typeof callback !== 'function') {
callback = false;
}
................
while(i) {
i --;
............
if(callback) {
callback(found)
}
............
}
}
- 回调方法是对象方法的时候:
var findNodes = function (callback, callback_obj) {
.........
if(typeof callback === 'string') {
callback = callback_obj[callback];
}
...........
if(typeof callback === 'function') {
callback.call(callnack_obj, found);
}
...........
}
//findNodes('paint', myapp); - 常使用情况:
- 异步事件监听器
- 超时
返回函数模式:根据输入,函数可以返回另一个更专门的函数,也可以按需创建另一个函数;
结合闭包创建的计数器的例子:
var setup = function() {
var count = 0;
return function () {
return count++;
}
}
惰性函数模式:函数直到第一次使用 时才被正确地定义,并且具有向后惰性,执行了更少的工作;
var scareMe = function() {
alert('Boo!');
scareMe = function() {
alert('Double boo!');
}
}
适用:具有仅需执行一次的初始化设定;
缺点:
- 重定义自身时,原本加上去的属性会消失或需要再次定义;
- 若赋值给其它方法,将不再具有这个功能;
即时函数模式:在函数定义之后立即执行
- 参数:一般通过括号传入
(function (a, b) {})(a, b); - 返回值:分配给变量;
- 可以使用即时函数的作用域存储一些私有数据:
var getResult = (function () {
var res = 2 + 2;
return function () {
return res;
}
})();
//可以和返回函数模式比较一下; - 定义对象属性时也可以用即时函数:
var o = {
message : (function () {
.......
}()),
getMsg: function() {
return this.message;
}
}
- 可以使用即时函数的作用域存储一些私有数据:
即时对象初始化模式:
- 概念:
- 保护全局作用域不受污染的另一个方法,类似于即时函数模式;
- 这种模式使用带有init()方法的对象,该方法在创建对象后会立即执行;
- init()函数负责所有初始化任务
({
//配置常数
maxWidth : 600,
maxHeigth: 400,
...........
//设置一些其他方法
gimmeMax: fnction () {
return this.maxWidth + 'x' + this.maxHeight;
}
..............
init: function () {
console.log(this.getmeMax());
............
}
}).init();
- 这种模式适用于一次性任务,如果在init()完毕之后保存该对象的引用,可以在init函数尾部添加 return this;
初始化时分支模式(优化模式): 如果知道某个条件在整个生命周期内不会发生改变,可以仅对该条件测试一次;
- XMLHttpRequest的例子:
- 在每次都测试的情况下:
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) {
........
}
} - 仅在第一次测试的情况下:
var utils = {
addListener : function (el , type, fn) { },
removeListener: function (el, type, fn) {
........
}
} var utils = {
addListener: null,
removeListener: nul
}
if (typeof window.addEventListener === 'function') {
utils.addListener = function (el, type, fn) {
el.addEventListener(type, fn, false);
}
utils.removeListener = function (el, type, fn) {
el.removeListener (type, fn, false);
}
} else if (typeof document.attachEvent === 'function') {
utils.addListener = function (el, type, fn) {
el.attachEvenr('on' + type, fn);
}
utils.removeListener = function (el, type, fn) {
el.detachEvenr('on' + type, fn);
}
} else {
utils.addListener = function (el, type, fn) {
el['on' + type] = fn;
}
utils.removeListener = function (el, type, fn) {
el['on' + type] = null;
}
}
- 在每次都测试的情况下:
备忘模式:在适当的时候自定义属性到函数中;
var myFunc = function () {
var cachekey = JSON.stringify(Array.prototype.slice.call(arguments)),
result;
if(!myFunc.cache[cachekey]) {
result = {};
.............
myFunc.cache[cachekey] = result;
}
return myFunc.cache[cachekey];
}
myFunc.cache = {};
配置对象模式:考虑到随着项目变化而需求变化而提供更简介的API的方法;
var conf = {
username: "batman",
first: "Bruce",
last: 'Wayne'
}
addPerson(conf)
特别适用于有许多可选特征属性的情况,如创建DOM时;
Curry模式:使函数理解并处理部分应用的过程称为Curry过程;
- curry化函数:
function curry(fn) {
var slice = Array.prototype.slice;
stored_args = slice.call(arguments, 1);
return function () {
var new_args = slice.call(arguments),
args = stored_args.concat(new_args);
return fn.apply(null, args);
}
}
//
function add(a, b) {
return a + b;
}
curry(add, 6)(7); - 使用bind
function add (a, b ,c) {
return a + b + c;
} add.bind(null,0,1)(2 /*c*/);
javascript优化--05模式(函数)的更多相关文章
- javascript优化--13模式1(DOM和浏览器模式)
注意分离: 通过将CSS关闭来测试页面是否仍然可用,内容是否依然可读: 将JavaScript关闭来测试页面仍然可以执行正常功能:所有连接是否正常工作:所有的表单是否可以正常工作: 不使用内联处理器( ...
- javascript优化--08模式(代码复用)01
优先使用对象组合,而不是类继承: 类式继承:通过构造函数Child()来获取来自于另一个构造函数Parent()的属性: 默认模式:子类的原型指向父类的一个实例 function inherit(C, ...
- javascript优化--06模式(对象)01
命名空间: 优点:可以解决命名混乱和第三方冲突: 缺点:长嵌套导致更长的查询时间:更多的字符: 通用命名空间函数: var MYAPP = MYAPP || {}; MYAPP.namespace = ...
- javascript优化--07模式(对象)02
沙箱模式: 解决空间命名模式的几个缺点: 命名空间模式中无法同时使用一个应用程序或库的两个版本运行在同一个页面中,因为两者需要相同的全局符号: 以点分割,需要输入更长的字符,解析时间也更长: 全局构造 ...
- javascript优化--11模式(设计模式)02
策略模式 在选择最佳策略以处理特定任务(上下文)的时候仍然保持相同的接口: //表单验证的例子 var data = { firs_name: "Super", last_name ...
- javascript优化--14模式2(DOM和浏览器模式)
远程脚本 XMLHttpRequest JSONP 和XHR不同,它不受同域的限制: JSONP请求的可以是任意的文档: 请求的URL通常格式为http://example.js?calback=Ca ...
- javascript优化--10模式(设计模式)01
单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...
- javascript优化--09模式(代码复用)02
原型继承 ://现代无类继承模式 基本代码: var parent = { name : "Papa" } var child = object(parent); function ...
- javascript笔记05:函数表达式和函数语句的区别
1.首先是函数语句: myfunc(); function myfunc() { //执行一些语句 } 当函数语句被定义的时候,在一个脚本代码被优先考虑,因此,无论该函数是定义之前或者定义之后都可以被 ...
随机推荐
- 移动前端调式页面--weinre
一:远程调式工具---weinre 阅读目录 一:远程调式工具---weinre 二: 安装weinre 三: 访问weinre及在页面上调用 四:多用户 回到顶部 一:远程调式工具---weinre ...
- Centos6.7安装Apache2.4+Mysql5.6+Apache2.4
首先说下思路,因为一开始系统上已经跑了一套完成的 PHP 环境,那时候都是快速自动安装的,如果是跑一些5.3以下版本的话,很简单,几个指令,10分钟搞定了. 但现在要升级,彻底一点的话,唯有推倒重来了 ...
- (转载)【Android】ViewGroup全面分析
转载自:http://www.cnblogs.com/lqminn/archive/2013/01/23/2866543.html 一个Viewgroup基本的继承类格式如下: import andr ...
- 基础知识《四》---Java多线程学习总结
本文转载自51cto 一.线程的基本概念简单的说:线程就是一个程序里不同的执行路径,在同一个时间点上cpu只会有一个线程在执行,Java里的多线程是通过java.lang.Thread类来实现的,每个 ...
- PeopleEditor允许客户端输入的同时验证输入的内容
如何判断PeopleEditor的值为空 在sharepoint开发中,我们经常会用到PeopleEditor这一控件,最近我在写程序的时候用到了,开始的时候不知道怎么用,后来问题解决啦,现在写出 ...
- TokuDB的特点验证
随着数据量越来越大,越来越频繁的遇到需要进行结构拆分的情况,每一次拆分都耗时很久,并且需要多方配合,非常的不想搞这个事情.于是在@zolker的提醒下想到了13年开源tokuDB,来解决我们迫在眉睫的 ...
- POJ 2549 Sumsets hash值及下标
题目大意:找到几何中的4个数字使他们能够组成 a+b+c=d , 得到最大的d值 我们很容易想到a+b = d-c 那么将所有a+b的值存入hash表中,然后查找能否在表中找到这样的d-c的值即可 因 ...
- oracle通过plsql导入dmp数据文件
首先安装Oracle,新建一个空的数据库mydb 从开始菜单运行cmd控制台:sqlplus "用户名/密码@数据库名 as sysdba"//例如sqlplus sys/admi ...
- sublime 3103liense
Sublime Text 3.x (after Build 309X) —– BEGIN LICENSE —–Michael BarnesSingle User LicenseEA7E-8213858 ...
- Material Design入门(三)
本文主要包括 CollapsingToolbarLayout实现滚动动画效果 ViewPager+tabLayout实现左右类Tab效果 控件介绍 这次需要用到得新控件比较多,主要有以下几个: Coo ...