JS中几种常见的高阶函数

JavaScript017

JS中几种常见的高阶函数,第1张

高阶函数:英文叫Higher-order function。JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

一个最简单的高阶函数:

编写高阶函数,就是让函数的参数能够接收别的函数。

下面介绍三个高阶函数:

一、map/reduce

如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:

1、map():

所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把Array的所有数字转为字符串:

2、reduce():

再看reduce的用法。Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是:

二、filter

filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素。和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。

可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。

回调函数:filter()接收的回调函数,其实可以有多个参数。通常我们仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身:

三、sort排序算法

因为Array的sort()方法默认把所有元素先转换为String再排序,结果'10'排在了'2'的前面,因为字符'1'比字符'2'的ASCII码小。如果不知道sort()方法的默认排序规则,直接对数字排序,绝对栽进坑里!

幸运的是,sort()方法也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。

把下面的这个做成一个js文件 然后就可以在任何页面调用了 /*================Method=======================* var_to_obj 将一个变量转换为对象* is_greater 判断是否大于某个数* is_less 判断是否小于某个数* Compare_Date 比较两个日期的大小 Num >Num return:trueNum <=Num return:false* is_numeric 判断是否是数字* is_price 判断是否是价格格式 带两位小数* Is_Null 判断是否是空true:空false:非空* IsSpace 判断是否空格* IsSpace 判断是否空格* Is_Int( 判断是否是整数true:是整数 false:不是整数* is_date 判断是否是日期* is_date 判断是否是日期* IsSelected 判断是否有有效数据被选中* isCharacter 检查是否是字符* isOtherNameCharacter 检查是否是其它可以作名称的字符* isNameCharacter 检查是否是可以作名称的字符* isEmail 检查是否是Email* isZIP 检查是否是邮编* isDigitalString 检查是否是数字字符串* IsEmpty IsEmpty函数判断一个字符串是否为空* Trim Trim函数去掉一字符串两边的空格* isDigital IsDigital函数判断一个字符串是否由数字(int or long)组成 * IsFloat IsFloat函数判断一个字符串是否由数字(int or long or float)组成 * IsTelephone 判断一个字符串是否由数字或 * () 组成 * dateTransfer 日期格式转化 / / * transferDate 转化日期 >/ / * ispassword 检查是否是密码* isLeapYear 判断是否为润年的函数* getDaysInMonth 取得每月天数的函数* jtrimstr 去掉字符串所有空格*=============================================*/

function doInputConnotEmpty(txtInput minLength sAlert){txtInput value=Trim(txtInput value)var m_IsValid=trueif(IsEmpty(txtInput value)) m_IsValid=falseif(minLength>){if(txtInput value length<minLength) m_IsValid=false}if(!m_IsValid){if(sAlert!= ) window alert(sAlert)txtInput focus()}return m_IsValid}

// 将一个变量转换为对象function var_to_obj(val){this value=val}// 判断是否大于某个数function is_greater(field crit limit){var Ret = (is_numeric(field ) ) ? (field value >limit ) : falseif (!Ret)doCritCode(field crit Value must be greater than +limit)return(Ret)}// 判断是否小于某个数function is_less(field crit limit){var Ret = (is_numeric(field ) ) ? (field value <limit ) : falseif (!Ret)doCritCode(field crit Value must be less than +limit)return(Ret)}

function is_numeric(field crit msg){var Ret = truevar NumStr= var decUsed=falsevar chrfor (i= i<field value length++i){chr=field value charAt(i)if (NumStr indexOf(chr )== ){if ( (!decUsed) &&chr== ){decUsed=true}else{Ret=false}}}if (!Ret)doCritCode(field crit msg)return(Ret)} // 判断是否是价格function is_price(field crit msg){var Ret = truevar NumStr= var decUsed=falsevar chrfor (i= i<field value length++i){chr=field value charAt(i)if (NumStr indexOf(chr )== ){if ( (!decUsed) &&chr== ){decUsed=true}else{Ret=false}}}if(Ret){if(decUsed&&(field value length field value indexOf( )<))else if(decUsed)Ret=false}if (!Ret)doCritCode(field crit msg)return(Ret)}

// 判断是否是空function is_null(field crit msg){var Text= + Trim(field value)if(Text length){ for(var i= i<Text lengthi++)if(Text charAt(i)!= &&Text charAt(i)!=   )breakif(i>=Text length){Ret=true}else{Ret=false}}elseRet=trueif (Ret)doCritCode(field crit msg)return(Ret)}function IsSpace(field){var Text= +field valueif(Text length){for(var i= i<Text lengthi++)if(Text charAt(i)!= &&Text charAt(i)!=   )breakif(i>=Text length)field value= }}

function doCritCode(field crit msg){if ( ( !=crit) ){alert(msg)if (crit== ){field focus()// focus does not work on certain netscape versionsfield select()}}}// 判断是否是整数function is_int(field crit msg){var Ret = truevar NumStr= var chrif (field value length== ){Ret=false}for (i= i<field value length++i){chr=field value charAt(i)if (NumStr indexOf(chr )== ){Ret=false}}if (!Ret)doCritCode(field crit msg)return(Ret)}// 判断是否是日期function is_date(field crit msg){var Ret = falsevar mark var mark var daysvar yvar mvar dif(field value== )return truecd=new Date()

if ( (mark = field value indexOf( ))== )mark =field value indexOf( )if (mark >){if ( (mark = field value indexOf( mark + )) == )mark =field value indexOf( mark + )if ((mark >)&&(mark + <field value length) ){y = parseInt(field value substring( mark ) )m = parseInt(field value substring(mark + mark ) )d = parseInt(field value substring(mark + field value length) )

year = new var_to_obj(y)month = new var_to_obj(m)day = new var_to_obj(d)days = getDaysInMonth(month value year value) +

if ((is_greater(day ))&&(is_less(day days))&&(is_greater(month ))&&(is_less(month ))&&(is_greater(year ))&&(is_less(year )))Ret=true}}if (!Ret) doCritCode(field crit msg)

return(Ret)}

function doCrit(field crit msg){if ( ( !=crit) ){alert(msg)if (crit== ){field focus()// focus does not work on certain netscape versions}}}// 判断是否有有效数据被选中function isselected(field crit msg){value= +field options[field selectedIndex] valueif(value== )Ret=falseelseRet=trueif (!Ret)doCrit(field crit msg)return(Ret)}

// 检查是否是字符// cCharacter 输入值function isCharacter( cCharacter ){var sFormat = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

if( sFormat indexOf( cCharacter ) == ){return false}

return true}

//判断是否是数字和字母的组合function isChrandNum( cCharacter ){for(ilen= ilen<str lengthilen++){if(str charAt(ilen) <|| str charAt(ilen) >){if(str charAt(ilen) <a || str charAt(ilen) >z ){if(str charAt(ilen) <A || str charAt(ilen) >Z )return false}} }return true}

// 检查是否是其它可以作名称的字符// cCharacter 输入值function isOtherNameCharacter( cCharacter ){var sFormat = _

if( sFormat indexOf( cCharacter ) == ){return false}

return true}function isOtherNameCharacter ( cCharacter ){var sFormat =

if( sFormat indexOf( cCharacter ) == ){return false}

return true}

function isOtherNameCharacter ( cCharacter ){var sFormat =

if( sFormat indexOf( cCharacter ) == ){return false}

return true}

// 检查是否是可以作名称的字符// sValue 输入值function isNameCharacter( sValue ){if( sValue == null ){return false}

for( i = i <sValue lengthi ++ ){var cCharacter = sValue charAt( i )if( isDigital( cCharacter ) == false &&isCharacter( cCharacter ) == false &&isOtherNameCharacter( cCharacter ) == false&&isOtherNameCharacter ( cCharacter ) == false&&isOtherNameCharacter ( cCharacter ) == false ){return false}}

return true}//检查是否是密码function ispassword( sValue ){if( sValue == null ){return false}

for( i = i <sValue lengthi ++ ){var cCharacter = sValue charAt( i )if( isDigital( cCharacter ) == false &&isCharacter( cCharacter ) == false &&isOtherNameCharacter( cCharacter ) == false){return false}}

return true}

// 检查是否是Email

// sValue 输入值 合法格式为a@b c d此类形式function isEmail( sValue ){var iFirstIndex = var iSecondIndex = sValue indexOf( @ )if( iSecondIndex == ){return false}

var sTemp = sValue substring( iFirstIndex iSecondIndex )if( isNameCharacter( sTemp ) == false ){return false}

iSecondIndex = sValue indexOf( )if( iSecondIndex == || sValue substring( sValue length sValue length ) == ){return false}else if( sTemp length == sValue length ) // The last o characters are @ and {return false}else{var sTempValue = sValueiSecondIndex = sValue indexOf( @ )while( iSecondIndex != ){iFirstIndex = iSecondIndex + sTempValue = sTempValue substring( iFirstIndex sTempValue length )// The right section of valueiSecondIndex = sTempValue indexOf( )//document write( sTempValue= + sTempValue + <br>)sTemp = sTempValue substring( iSecondIndex )//document write( sTemp= + sTemp + <br>)if( isNameCharacter( sTemp ) == false ){return false}}

if( isNameCharacter( sTempValue ) == false ){return false}}

return true}

// 检查是否是邮编// sValue 输入值 合法格式为六位整数function isZIP( sValue ){if( sValue == null ){return false}

if( sValue length != ){return false}else{for( i = i <i ++ ){if( isDigital( sValue charAt( i ) ) == false ){return false}}}

return true}

// 检查是否是数字字符串// sValue 输入值function isDigitalString( sValue ){if( sValue == null ){return false}

for( i = i <sValue lengthi ++ ){if( isDigital( sValue charAt( i ) ) == false ){return false}}}

//IsEmpty函数判断一个字符串是否为空function IsEmpty(his){flag = truefor(var i= i<his lengthi++){if(his charAt(i)!= ){ flag = falsebreak}}return flag}//Trim函数去掉一字符串两边的空格function Trim(his){//找到字符串开始位置Pos_Start = for(var i= i<his lengthi++){if(his charAt(i)!= ){Pos_Start = ibreak}}//找到字符串结束位置Pos_End = for(var i=his length i>= i ){if(his charAt(i)!= ){Pos_End = ibreak}}//返回的字符串Str_Return = if(Pos_Start!= &&Pos_End!= ){ for(var i=Pos_Starti<=Pos_Endi++){Str_Return = Str_Return + his charAt(i)}}return Str_Return} //IsDigital函数判断一个字符串是否由数字(int or long)组成 function isDigital(str) {for(ilen= ilen<str lengthilen++){if(str charAt(ilen) <|| str charAt(ilen) >){return false} }return true}//IsFloat函数判断一个字符串是否由数字(int or long or float)组成 function IsFloat(str) {flag_Dec = for(ilen= ilen<str lengthilen++){if(str charAt(ilen) == ){flag_Dec++if(flag_Dec >)return falseelsecontinue} if(str charAt(ilen) <|| str charAt(ilen) >){return false} }return true}//IsTelephone函数判断一个字符串是否由数字或 * 组成 function IsTelephone(str) {for(ilen= ilen<str lengthilen++){if(str charAt(ilen) <|| str charAt(ilen) >){if((str charAt(ilen)!= )&&(str charAt(ilen)!= * ))return false} }return true}

//比较两个日期的大小 Num >Num return:trueNum <=Num return:falsefunction Compare_Date(Num Num ){var pos pos endvar para para para para para para

//para :年//para :月//para :日end=Num lengthpos =Num indexOf( )pos =Num indexOf( pos + )para =Num substring( pos )para =Num substring(pos + pos )para =Num substring(pos + end)para =parseInt(para )para =parseInt(para )para =parseInt(para )end=Num lengthpos =Num indexOf( )pos =Num indexOf( pos + )para =Num substring( pos )para =Num substring(pos + pos )para =Num substring(pos + end)para =parseInt(para )para =parseInt(para )para =parseInt(para )if(para >para ){return true}else if(para ==para ){if(para >para ){return true}else if(para ==para ){if(para >para ){return true}}}return false}

//去掉字符串所有空格function jtrimstr(str){var i= var jvar len=str lengthtrimstr= while(i<len){if(str charAt(i)!= ){trimstr=trimstr+str charAt(i)}i++}return(trimstr)}//转化日期function transferDate(str){var m= var strlen=str lengthvar n=strlen while (n>=strlen ){if(str charAt(n)== ){break}n=n }trimstr=str substring(m+ n)+ / + str substring(n+ strlen)+ / +str substring( m) return(trimstr)}

// 取得每月天数的函数//参数说明 month 月year 年// 返回值 days 天数function getDaysInMonth(month year) {var daysif (month== || month== || month== || month== || month== || month== || month== ) days= else if (month== || month== || month== || month== ) days= else if (month== ) {if (isLeapYear(year)) { days= }else { days= }}return (days)}// 判断是否为润年的函数//参数说明 Year 年份// 返回值:如果是润年 返回true 否则返回false

function isLeapYear (Year) {if (((Year % )== ) &&((Year % )!= ) || ((Year % )== )) {return (true)} else { return (false)}}

function isCharnum(str) {for(ilen= ilen<str lengthilen++){if(str charAt(ilen) <|| str charAt(ilen) >){if((str charAt(ilen)!= x ))return false} }return true}

function isCharsf(str) {for(ilen= ilen<str lengthilen++){if(str charAt(ilen) <|| str charAt(ilen) >){if(str charAt(ilen) <a || str charAt(ilen) >z )return false} }return true}

//判断一个字符串是否是由数字和 组成

function i *** onth(str) {for(ilen= ilen<str lengthilen++){if(str charAt(ilen) <|| str charAt(ilen) >){if((str charAt(ilen)!= ))return false} }return true}

lishixinzhi/Article/program/Java/Javascript/201311/25474

初次接触回调函数的时候,总是一直纳闷什么是回调函数,首先我们先弄清楚什么是回调函数?

在弄懂回调函数的之前我们要先弄懂什么是高阶函数:所谓高阶函数, 就是值函数的一个参数是函数(这个参数就是回调函数) , 或者函数的返回值是函数 , 满足这两个的其中一个 就是 高阶函数

   首先我们可以通过一组案例实现:

   //然后定义一个myFor(可以随便定义)函数,这个函数需要传两个参数:数组,回调函数。注意这里的myFore就是我们后期如果定义回调函数的一个方法名,图中的callback的意思就是回调函数所在的位置,只不过我们平常都习惯用callback这个名义去定义回调函数,参数名不固定。

这里我们通过一个例子去实现我们是如何调用回调函数的:

最后的答案是: