js高阶函数
在介绍什么是高阶函数之前,先看一下高阶函数的两个特点,了解这两个特点了,也就知道什么是高阶函数了(是不是废话- -!)
- 函数可以作为参数被传递
- 函数可以作为返回值输出
现在知道什么是高阶函数了吗?不知道也没问题,接着往下看。
js中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是让函数的执行结果返回另外一个函数,这两种情形都有很多应用场景。我们围绕这两个特点展开说一下:
函数作为参数传递
//TODO
函数作为返回值输出
在工作中,可能会经常要对数据类型进行判断。比如判断是不是一个数组最常用的做法是Object.prototype.toString.call([1,2,3])它的返回值是一个字符串“[object Array]”,判断是否为字符串Object.prototype.toString.call(‘iVan’)返回“[object String]”,然后我们的代码可能是这样的:
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(obj) {
return Object.prototype.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])); //true
是不是舒服多了,又体现了函数作为返回值输出
又减少了多余的代码,最重要的是复用性更高了。
那么问题来了,每次传String
Number
Array
好麻烦!那我们再升级一下!
;(function(){
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
})();
是不是舒服多了!
结语
本文引用于《js设计模式与开发实践》