15.js高级函数

1.惰性函数
惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。
为了兼容各浏览器,对事件监听的的支持:

function addEvent (type, element, fun) {
    if (element.addEventListener) {
        element.addEventListener(type, fun, false);
    }
    else if(element.attachEvent){
        element.attachEvent('on' + type, fun);
    }
    else{
        element['on' + type] = fun;
    }
}

可以看到每次调用事件时都需要去查看各个分支,而我们使用惰性函数进行改进,在第二次的时候会重写该函数,以后就不需要再去走每个分支了。

function addEvent (type, element, fun) {
    if (element.addEventListener) {
        addEvent = function (type, element, fun) {
            element.addEventListener(type, fun, false);
        }
    }
    else if(element.attachEvent){
        addEvent = function (type, element, fun) {
            element.attachEvent('on' + type, fun);
        }
    }
    else{
        addEvent = function (type, element, fun) {
            element['on' + type] = fun;
        }
    }
    return addEvent(type, element, fun);
}

2.级联函数
级联函数又称链式调用,方法链一般适合对一个对象进行连续操作(集中在一句代码)。一定程度上可以减少代码量,缺点是它占用了函数的返回值。

function Person(){
 this.name="";
 this.age="";
 this.sex="";
}
Person.prototype={
//当改变原型对象时需要重新设置constructor
constructor:Person,
 setname:function(){
  this.name="katherine";
  return this;
 },
 setage:function(){
  this.age="22";
  return this;
 },
 setsex:function(){
  this.sex='girl';
  return this;
 }
}
 let p1=new Person().setname().setage().setsex();

3.函数柯里化
简单来讲就是参数合并

function curry(fn){
    //首先获取函数除fn之外的剩下的参数
    let args=Array.prototype.slice(arguments,1);
    return function(){
    let innerArgs=Array.prototype.slice.call(arguments);
    let finalArgs=args.concat(innerArgs);
    return fn.apply(this,finalArgs);   
 }
}
function add(num1,num2,num3){
    return num1+num2+num3;
}
let t=curry(add,50)(1,2);
alert(t);//53

你可能感兴趣的:(15.js高级函数)