高阶函数是指至少满足下列条件之一的函数。
函数可以作为参数被传递
- 回调参数
在ajax异步请求的应用中,回调函数的使用非常频繁。当我们想在ajax请求返回之后做一些事情,但又并不知道请求返回的确切时间时,最常见的方案就是把callback函数当作参数传入发起ajax请求的方法中,待请求完成之后执行callback函数:
var getUserInfo = function(userId, callback){
$.ajax('http://xxx.com/getUserInfo?' + userId, function(data){
if(typeof callback === 'function'){
callback(data);
}
});
}
getUserInfo(13157, function(data){
alert(data.userName);
});
回调函数的应用不仅只在异步请求中,当一个函数不适合执行一些请求时,我们也可以把这些请求封装成一个函数,并把它作为参数传递给另外一个函数,“委托”给另外一个函数来执行。
比如我们想在页面创建100个div节点,然后把这些节点都设置为隐藏。
var appendDiv = function(){
for(var i = 0; i < 100; i++){
var div = doucment.createElement('div');
div.innerHTML = i;
document.body.appendChild(div);
div.style.display = 'none';
}
};
appendDiv();
//更好的处理方式
var appendDiv = function(){
for(var i = 0; i < 100; i++){
var div = document.createElement('div');
div.innerHTML = i;
document.body.appendChild(div);
if(typeof callback === 'function'){
callback(div);
}
}
};
appendDiv(functon(node){
node.style.display = 'none';
});
- Array.prototype.sort
Array.protoype.sort接收一个函数当参数,这个函数里面封装了数组元素的排序规则。目的是对数组进行排序,这是不变的部分;而使用什么规则去排序,则是可变的部分。把可变的部分封装在函数参数里,动态传入Array.prototype.sort
[1,4,3].sort(function(a,b){
return a- b;
});//[1,3,4]
[1,4,3].sort(function(a,b){
return b - a;
});//[4,3,1]
函数可以作为返回值输出
- 判断数据的类型
var isString = function(obj){
return Object.prototype.toString.call(obj) === '[object String]';
};
var isArray = function(obj){
return Object.prototype.toString.call(obj) === '[object Array]';
};
var isNumber = function(){
return Object.protype.toString.call(obj) === '[object Number]';
};
// 改进
var isType = function(type){
return function(obj){
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
}
};
var isString = isType('String');
var isArray = isType('Array');
var isNumber = isType('Number');
console.log(isArray([1,2,3]));
//使用循环语句来批量注册这些isType函数
var Type = {};
for(var i = 0,type;type = ['String','Array','Number'][i++];){
(function(type){
Type['is' + type] = function(obj){
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
}
})(type)
};
Type.isArray([]);//true
Type.isString('str');//true
- getSingle
var getSingle = function(fn){
var ret;
return function(){
return ret || (ret = fn.apply(this, arguments));
};
};
//既把函数当作参数传递,又让函数执行后返回了另外一个函数。
var getScript = getSingle(function(){
return document.createElement('script');
});
var script1 = getScript();
var script2 = getScript();
alert(script1 === script2);//true