回调
回调是为了解决同步异步的问题。 默认的写法:
request=prepare_the_request();
response=send_request_synchronously(request);
display(response);
这种方式的话,我们必须等到send_request_synchronously()函数结束,display才开始运行。 如果send_request_synchronously()耗时较长的话(如HTTP请求),那么就会发现页面等了很久才开始渲染,因此就要采用一种异步的方式。 解决方案——采用回调函数方式
request=prepare_the_request();
send_request_asynchronously(request,function(res){
display(res);
})
但是这里我一直没有搞清楚,因为在res返回前,会先执行display,但是在Ajax里面,如果指明了是异步,.sucess 返回成功的数据, 这样返回的数据是undifined。
模块
所谓模块,就是提供接口却隐藏状态和实现的这么一个东西。 可以利用函数来构建模块。 采用自调用匿名函数。
级联
让一些方法返回this而不是undefined 例如一种写法:
getElement('mydiv')
.move(200,300)
.width(100)
套用
函数科利华就是一个典型的例子。
var add=function(a,b){
return a+b;
}
//给Function添加curry方法
Function.method('curry',function() {
var args=arguments,
that=this;
return function(){
return that.apply(null,args.concat[arguments]);
}
})
var add1=add.curry(1);console.log(add1(6));
不过报错提示没有Function.method
记忆
函数可以用对象去记忆先前的操作
var cunt=0;
var fibonacci=function (n) {
cunt+=1;
return n<2?n:fibonacci(n-1)+fibonacci(n-2);
}
for(var i=0;i<=10;i+=1){
console.log('i:'+i+': '+fibonacci(i));
}
console.log('count:'+cunt)//453console.log('i:'+i+': '+fibonacci(i));
}
这个代码就是不具备记忆功能: 上面代码实现的功能是 f(0)=0,f(1)=1,f(2)=2,f(3)=f(2)+f(1),f(4)=f(3)+f(2)....
但是它的弊端在于,例如计算f(4),它还会再去调一下f(3),f(2),f(1)的计算过程,这样就太麻烦了。导致居然调用了453次这个f函数
//采用一种记忆的方式
var cunt=0;
var fibonacci=function(){
var memo=[0,1];
var fib=function(n){
cunt+=1;
var result=memo[n];
if(typeof result!=='number'){
result=fib(n-1)+fib(n-2);
memo[n]=result;
}
return result;
};
return fib;
}();
for(var i=0;i<=10;i+=1){
console.log('i:'+i+': '+fibonacci(i));
}
console.log('count:'+cunt)
这里的fibonacci是一个对象,具有属性memo和fib,返回给外部的是fib(),外部无法访问memo,仅供内部访问,每次查询memo是否缓存,有数据的话就不必掉fib函数,而是直接使用,这样count计数只调用了29次。