一、级联
级联就是链式调用,形式如obj.a().b().c()
- 分析
级联是怎么实现的呢?我们知道只有对象才可以调用对象方法,那么obj.a()返回一个对象就可以调用返回对象的方法c。
值得注意的是:obj.a()不一定要返回obj对象,可以返回其它的对象(几乎没见过)
- 实现
- 单例模式
var obj = { a : function(){ // some code here return this; }, b : function(){ // some code here return this; } }
- 构造器模式
function Obj(){ this.a = function(){ // some code here return this; } this.b = function(){ // some code here return this; } }
- 构造器 + 闭包
function createObj(){ // private code // 对外暴露的对象类型 function Other(){ this.a = function(){ // some code here return this; } this.b = function(){ // some code here return this; } } return new Other(); }
二、记忆
函数可以将先前操作的结果记录在某个对象中,避免重复无谓的操作
- 例子 —— fibonacci数列
- 原本的函数:
可以发现,在递归过程中,函数进行了许多不必要的重复操作。// 默认输入的x是自然数 function fibonacci(x){ if(x == 0 || x == 1){ return 1; }else{ return fibonacci(n-2) + fibonacci(n-1); } }
- 记忆的函数:
改进后的函数不断把已经计算过的值记录起来,减少了不必要的重复计算。function fibonacci(){ // 用于记忆的数组初始化 var memo = [1, 1]; // 实际操作的函数,默认输入的x是自然数 function fib(x){ // 期待记忆数组已有该记录 var result = memo[x]; // 如果没有 if(typeof result !== 'number'){ // 计算 result = fib(x-2) + fib(x-1); // 记录该值 memo[x] = result; } // 返回结果 return result; } return fib; }
- 通用的记忆函数构造器
- 构造器的实现
/** 记忆函数构造器 @param memo {array} 记忆数组 @param formula {function} 逻辑处理函数 @return recur {function} 操作函数 */ var memoizer = function(memo, formula){ // 复制记忆数组 var recurMemo = memo.slice(0); // 实际的操作函数 —— 返回第n个数的值 var recur = function(n){ // 期待在记忆数组中找到结果 var result = recurMemo[n]; // 如果没有 if(typeof result !== 'number'){ /* 计算: 把实际的操作函数recur传递给formula,以便formula使用recur进行逻辑操作 */ result = formula(recur, n); // 记录 recurMemo[n] = result; } return result; } return recur; }
- 构造器的使用
// 计算fibonacci数列 var fib = memoizer([1,1], function(recur, n){ return recur(n-2) + recur(n-1); }); // 计算阶乘 var fatorial = memoizer([1,1], function(recur, n){ return n * recur(n-1); });
网友评论