回调

回调是为了解决同步异步的问题。 默认的写法:

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次。

results matching ""

    No results matching ""