js里常用函数之高阶函数
高阶函数:将函数作为参数或者返回值的函数。将函数作为参数的用法通常称作回调函数,函数参数通常会在主函数被执行之后被高阶函数调用。
高阶函数的使用实例。可以把有相似操作的函数用一个高阶函数来重构,精简代码
如有一个比较函数:compareNumbers
1 function compareNumbers(x, y){ 2 3 if(x > y){ 4 5 return -1; 6 7 }else{ 8 9 return 1; 10 11 } 12 13 return 0; 14 15 } 16 17 //我们在排序的时候讲compareNumbers作为参数传递给sort 函数,就可以指定数组的排序方式 18 19 [3, 1, 4, 1, 5, 9].sort(compareNumbers);//[1, 1, 3, 4, 5, 9]
当然我们可以直接把compareNumbers替换为一个匿名函数,简化代码。
1 [3, 1, 4, 1, 5, 9].sort(function (x, y) { 2 3 if(x > y){ 4 5 return -1; 6 7 }else{ 8 9 return 1; 10 11 } 12 13 return 0; 14 15 });//[1, 1, 3, 4, 5, 9]
生成26个字母组成的字符串
1 var aIndex = "a".charCodeAt(0);//97 字符a的ascii编码 2 3 var alphabet = ""; 4 5 for (var i = 0; i < 26; i++){ 6 7 alphablet += String.fromCharCode(aIndex +i); 8 9 } 10 11 alphabet;//"abcdefghijklmnopqrstuvwxyz"
生成一个包含数字的字符串
1 var digits = '''; 2 3 for (var i = 0; i< 10; i++){ 4 5 digits += i; 6 7 } 8 9 digits;//"0123456789"
创建一个随机的字母字符串,长度为8
1 var random = ""; 2 3 for (var i = 0; i < 8; i++){ 4 5 random = String.fromCharCode(Math.floor(Math.random() * 26) + aIndex); 6 7 } 8 9 random;//"bdwvfrtp"
对于上面的三种生成字符串的逻辑,基本类似,只是生层规则不一样,我们就可以把不同生成字符串的逻辑抽出,放到一个函数类型的形参里。
1 function buildString(n, callback) { 2 3 var result = ""; 4 5 for(var i = 0; i < n; i++) { 6 7 result += callback(i); 8 9 } 10 11 return result; 12 13 }
现在可以简化这三个生成字符串的方法为:
1 var alphabet = buildString(26, function(i){ 2 3 return String.fromChar(aIndex + i); 4 5 }); 6 7 8 var digits = buildString(10, function(i){ 9 10 return i; 11 12 }); 13 14 15 var alphabet = buildString(26, function(i){ 16 17 return String.fromChar(Math.floor(Math.random()*26)); 18 19 });
参考资料:Effective JavaScript