Javascript是您的高阶函数(高级应用程序)。
回调函数
代码复用是测量应用的一个重要标准。代码的可重用性,可以通过回调函数将改变业务逻辑有效改善。例如,foreach方法是添加到ES5数组,遍历数组的每个元素,和相同的函数调用。
数组{ };
array.foreach =功能(ARR,FN){
对于(var i = 0,len = arr.length;我< len;i++){
FN(ARR {我},我,ARR);
}
}
业务的重点集中在回调函数的回调函数中,而不必每次重复遍历代码。
部分功能
作为返回值的函数的一个典型应用是一个局部函数,部分函数指的是使用一个函数创建一个调用另一部分的函数,这个参数或变量已经预先设定。偏函数最典型的例子是类型判断。
所有的Javascript对象有三个属性:原型属性,类属性、可扩展性。(未知的学生回到犀牛,哦,页:138)属性是一个字符串,Javascript不直接提供,但我们可以用object.prototype.tostring间接得到它。函数始终返回以下形式:
{对象类}
所以我们可以写一个系列的类型的功能。
代码如下:
isstring =功能(obj){
返回object.prototype.tostring.call(obj)={对象的字符串};
}
isnumber =功能(obj){
返回object.prototype.tostring.call(obj)={对象编号};
}
ISArray =功能(obj){
返回object.prototype.tostring.call(obj)={对象数组};
}
大多数代码是重复的,高阶函数是华丽的。
类型=功能(型){
返回功能(obj){
返回object.prototype.tostring.call(obj)= {对象+类型+ };
}
}
isstring =类型('String');
isnumber =类型(数的);
ISArray =类型('array);
因此,通过指定一些参数来返回一个新的自定义函数,它是一个局部函数。
加脂(柯丽华)
阿谀奉承也叫做局部评价,腐熟功能先接受一些参数。接受这些参数后,函数不会立即进行评估,而是继续返回到另一个函数。刚刚传递的参数保存在函数形成的闭包中。当一个函数确实需要求值时,所有的前入参数都将用于一次求值。
VaR钻营=功能(Fn){
var args = { };
返回函数(){
如果(arguments.length = 0){
返回fn.applay(这,args);
{人}
args = args.concat(参数);
返回arguments.callee;
}
}
}
假设我们用一个月的时间来计算一个月的成本:
VaR钻营=功能(Fn){
调试器;
var args = { };
返回函数(){
如果(arguments.length = 0){
返回fn.apply(这,args);
{人}
Array.prototype.push.apply(参数,参数);
返回arguments.callee;
}
}
}
成本=函数(){
var总和= 0;
对于(var i = 0,len = arguments.length;我< len;i++){
总和=参数{ };
}
收起回复;
}
可变成本=腐熟(成本);
成本(100);
成本(200);
警报(费用)
事件节流
在某些情况下,某些事件可能引发反复,但事件处理函数不需要执行一次。例如,在window.resize事件复杂的逻辑,如果用户频繁改变浏览器的大小,复杂的计算会对性能产生严重的影响;有时这些逻辑运算不需要每个rezise触发器,只有数量有限的时间可以计算的。在这一点上我们需要忽略一些事件请求根据时间段。请看下面的节流作用:
功能节流阀(FN,间隔){
var = false;
返回函数(){
如果(做){
返回;
}
做=真的;
Fn.apply(这个参数);
setTimeout(){()函数(
做=假;
},区间);
}
}
window.onresize =节流(函数(){()
console.log('execute);
},500);
通过控制函数的执行时间,对函数的数量和功能需求之间的完美平衡是可以实现的。另一件事是MouseMove。如果我们将事件绑定到一个DOM元素,事件将触发多次当鼠标移动在改性元素。
事件结束
对于一些可以频繁触发的事件,有时我们希望在事件结束后进行一系列操作,此时我们可以使用高阶函数进行以下处理:
功能消抖(FN,间隔){
var定时器= null;
函数延迟(){
var目标=;
var args =参数;
setTimeout()函数返回((){
fn.apply(目标,args);
},区间);
}
返回函数(){
如果(定时器){
ClearTimeout(定时器);
}
定时器= delay.apply(这个参数);
}
};
window.onresize =节流(函数(){()
console.log('resize结束);
},500);
如果事件在这个过程中触发,则最后一个事件句柄被清除,执行时间被重新绑定。
参考材料uff1a
节点
Javascript设计模式和开发实践