提要
js当中的函数站在差别的角度有差别的分类和运用,本文站在高阶函数的角度来议论js当中函数的运用场景。
起首明白高阶函数定义:
- 函数能够作为参数被通报
- 函数能够作为返回值输出
运用场景
函数作为参数被通报
这类状况实际上是比较罕见的,日经常使用的挺多的,比方ajax要求胜利今后的callback函数、种种插件,框架当中的钩子函数等等。下面举个我们经常使用的例子:
var tmpAry=[2,1,3];
tmpAry.sort(function(a,b){
return a-b;
});
console.log(tmpAry); //[1,2,3]
目标:把函数中易变或公用逻辑抽离,封装成函数参数,断绝变与稳定部份,到达更好的封装和复用。
函数作为返回值输出
这个实在我在一样平常写代码顶用的比较少,但并不能申明这个不罕见,所以下面我会多举几个例子。
处理老版本浏览器bind函数兼容性问题
Function.prototype.bind=function(context){
var self=this;
return function(){
return self.apply(context,args);
}
}
推断数据类型
var isType=function(type){
return function(obj){
return Object.prototype.toString.call(obj)==='[object '+ type + ']';
}
}
var isString=isType('String');
console.log(isString('gcy')); //true
高阶函数完成aop
AOP也就是面向切面编程,在java中这个观点基本且主要。详细就是经由过程reflect或动态代办(jdk动态代办和cglib动态代办)动态的在营业函数之前或今后增加一些
可复用的代码逻辑,比方典范的日记统计、权限掌握等等。用aop的目标就是愿望营业逻辑模块高内聚,同时到达非营业大众模块可复用,易保护。
Function.prototype.before=function (beforefn) {
var _self=this;//保留原函数的援用
return function () { //代办函数
beforefn.apply(this,arguments);
_self.apply(this,arguments);
}
};
Function.prototype.after=function (afterfn) {
var _self=this;
return function () {
var ret=_self.apply(this,arguments);
afterfn.apply(this,arguments);
return ret; //实行原函数,并返回原函数的实行效果
}
}
var func=function () {
console.log('ing');
}
func=func.before(function () {
console.log("before")
}).after(function () {
console.log("after");
})
func(); //before ing after
这个实在有许多运用场景,比方统计函数实行时间,动态转变函数参数等等。
function currying
起首currying的观点是部份求值,详细寄义就是指动态的接收一些参数,不马上求值,在须要盘算求值时接见之前闭包中保留的参数,一次性举行求值。
下面是一个部份求值通用的currying函数。
var currying=function (fn) {
var args=[];
return function () {
if(arguments.length===0){
return fn.apply(this,args);
}else{
[].push.apply(args,arguments);
return arguments.callee; //指向当前匿名函数,以便于参数一连暂存
}
}
}
var cost=(function () {
var money=0;
return function () {
for(var i=0,len=arguments.length;i<len;i++){
money+=arguments[i];
}
return money;
}
})();
var cost=currying(cost);
var step1=cost(1);
var step2=step1(2);
var step3=step2(3)
console.log(step3()); //6
总结
实在高阶函数运用场景许多,我只是总结列举了一些本身进修中碰到的典范例子,今后碰到一些恰当的,会继承完美。