高阶函数

高阶函数是指至少满足下列条件之一的函数。

函数可以作为参数被传递
  1. 回调参数
    在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';
});
  1. 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]
函数可以作为返回值输出
  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
  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值