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