• 1.函数作为参数传递

    • 1.回调函数
    • 2.Array.prototype.sort
  • 2.函数作为返回值输出
    • 1.判断数据的类型
  • 3.高级函数的实现AOP
  • 4.高阶函数的其他应用
    • 1.currying 函数柯里化
    • 2.uncurring
    • 3.函数节流
    • 4.分时函数
    • 5.惰性加载函数

1.函数作为参数传递

1.回调函数

最经常用的或许就是异步Ajax了

var getUserInfo = function(userId,callback){
$.ajax("http://xxx.com/getUserInfo?"+userId,function(data){
callback(data);
});
}
getUserInfo(14157,function(data){
alert(data.userName);
});

2.Array.prorotype.sort

var array = [1,2,4];
array.sort(function(a,b){
return b-a;
}); console.log(array);

2.函数作为返回值输出

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(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(isString([1,2,3,4]));
3.高级函数的实现AOP Function.prototype.before=function(beforefn){
var _self = this; //这里的this实际上是func的this
return function(){
//这个this是before 的this
beforefn.apply(this,arguments); //这个是函数
return _self.apply(this,arguments); //func函数
}
}
Function.prototype.after=function(afterfn){
var _self = this; //这里的this实际上是func的this
return function(){
var ret = _self.apply(this,arguments); //func函数 实际上func可以包含before函数函数
//这个this是after 的this
afterfn.apply(this,arguments); //这个是函数
return ret;
}
}
var func = function(){
console.log('2');
}
var asdf = func.before(function(){
console.log('1');
}).after(function(){
console.log('3');
}); asdf();

流程图 

3.高阶函数其他应用

1.函数柯里化 currying函数

currying又称部分求值,一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。带到函数真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。

var currying = function(fn){
var args = [];
return function(){
if(arguments.length == 0){
var Mynameisbalabala;
return fn.apply(this,args); //不要被这个this迷惑,实际是将argus传递给cost进行计算
//return fn.apply(Mynameisbalabala,args);
}else{
[].push.apply(args,arguments);
return arguments.callee; //返回该函数
}
}
};
var ASF2FASD = (function(){
var money = 0;
return function(){
for(var i=0;i<arguments.length;i++){
money +=arguments[i];
}
return money;
}
})();
var ASDFA = currying(ASF2FASD);
console.log(ASDFA(100).toString());
/* ASDF(100) 返回 ==(return fn.apply(this,args))
function (){
if(arguments.length == 0){
var Mynameisbalaba;
return fn.apply(this,args); //不要被这个this迷惑,实际是将argus传递给cost进行计算
//return fn.apply(Mynameisbalaba,args);
}else{
[].push.apply(args,arguments);
return arguments.callee; //返回该函数
}
}
*/
ASDFA(100);//
ASDFA(100);//
ASDFA(300);//
console.log(ASDFA()); //

2.uncurrying函数

在JavaScript中,当我们调用对象的某个方法时,其实不用关心该对象原本是否设计为拥有这个方法,这是动态类型语言的特点,也是常说的鸭子类型的意思。


我们常用call和apply可以把任意对向当做this传入某个方法,这样一来,方法中用到this的地方就不在局限与原来规定的对象,而是加以泛化并得到更广的适用性。那么有没有把泛化this的过程提取出来呢....

仔细看一下代码还是很简单的不注解了.....

Function.prototype.uncurrying = function(){
var self = this;//此时是Array.prototype.push
return function() {
var obj = Array.prototype.shift.call(arguments);
//obj是{
//'length':1,
//'0':1
//}
//arguments 对象的第一个元素被截取
return self.apply(obj,arguments);
//相当于 Array.prototype.push.apply(obj,2);
}
}
var push = Array.prototype.push.uncurrying();
var obj = {
"length":1,
"0":1
}
push(obj,2);
console.log(obj);

除了这样方法下面代码也是uncurrying的另一个实现方式:【】

Function.prototype.uncurrying = function(){
var self = this;
return function(){
// Function.prototype.call { '0': 1, length: 1 }
return Function.prototype.call.apply(self,arguments); //self =>asdfasdfasdfasdf对象 这里的this的话应该是push
}
} var push = Array.prototype.push.uncurrying();
var asdfasdfasdfasdf = {
"length":1,
"0":1
}
push(asdfasdfasdfasdf,2);
console.log(asdfasdfasdfasdf);

3.函数节流

函数调用频率过高,非常消耗性能的情况下使用函数节流比如监视窗口浏览器大小,比如监视鼠标的移动效果

实现节流:

var throttle = function (fn,interval){
var _self = fn, //保存需要执行的函数引用
timer, //定时器
firstTime = true; //是否是第一次执行调用 return function(){
var args =arguments,
__me = this; //要执行的函数
if(firstTime){ //如果是第一次调用,不需要延迟执行
_self.apply(__me,args);
return firstTime = false;
}
if(timer){ //如果定时器还在,说明前一次延迟执行还没有完成
return false;
}
timer = setTimeout(function(){
clearTimeout(timer);
timer = null;
_self.apply(__me,args);
},interval || 500);
}
} window.onresize = throttle(function(){
console.log('1');
},1000);

4.分时函数

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script>
var timeout = function(ary,fn,count){
console.log('5');
var obj,
t;
var len = ary.length;
var start = function(){
for(var i=0;i<Math.min(count || 1,ary.length);i++){
var obj = ary.shift();
fn(obj);
}
};
return function(){
console.log('1');
t = setInterval(function(){
if(ary.length === 0){
return clearInterval(t);
}
start();
},1000);
};
};
var ary = [];
for(var i=1;i<=1000;i++){
ary.push(i);
};
var renderFriendList = timeout(ary,function(n){
var div = document.createElement("div");
div.innerHTML = n;
document.body.appendChild(div);
},8);
renderFriendList();
</script>
</html>

5.惰性加载函数

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="div1">点击我绑定事件</div>
</body>
<script>
var addEvent = function(elem,type,handler){
if(window.addEventListener){
addEvent = function(elem,type,handler){
elem.addEventListener(type,handler,false);
}
}else if(window.attachEvent){
addEvent = function(elem,type,handler){
elem.attachEvent('on'+type,handler);
}
}
addEvent(elem,type,handler);
}
var div = document.getElementById('div1');
addEvent(div,'click',function(){
alert('1');
})
addEvent(div,'click',function(){
alert('2');
})
</script>
</html>

《JavaScript设计模式与开发》笔记 6.高阶函数的更多相关文章

  1. javascript设计模式学习之三—闭包和高阶函数

    一.闭包 闭包某种程度上就是函数的内部函数,可以引用外部函数的局部变量.当外部函数退出后,如果内部函数依旧能被访问到,那么内部函数所引用的外部函数的局部变量就也没有消失,该局部变量的生存周期就被延续. ...

  2. JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)

    说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...

  3. JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)

    上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...

  4. Python学习笔记系列——高阶函数(map/reduce)

    一.map #变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数被称之为高阶函数 def add(x,y,f): return f(x)+f(y) print( ...

  5. scala学习笔记:高阶函数

    scala> def power(y:Double)=(x:Double)=>Math.pow(x,y) warning: there were 1 deprecation warning ...

  6. Python学习笔记系列——高阶函数(filter/sorted)

    一.filter #filter()函数用于过滤序列.和map()类似,也接收一个函数和一个序列,把函数依次作用于每个元素,根据返回值是True还是False决定是否保留该元素. #filter()函 ...

  7. JavaScript高阶函数(Heigher-order function)

    概念 <javascript设计模式和开发实践>中定义 函数既可作为参数被传递,也可以作为返回值输出 满足以下条件: 接受一个或多个函数作为输入 输出一个函数 高阶函数一般是那些函数型包含 ...

  8. JavaScript高阶函数 map reduce filter sort

    本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 高阶函数            一个函数就接收另一个函数作为参数,这种函数就称之为高阶函数          1.高阶函数之map:   ...

  9. 浅析javascript高阶函数

    什么是高阶函数:在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数: 1. 接受一个或多个函数作为输入: 2. 输出一个函数.在数学中它们也叫做算子(运算符)或泛函.微积分中的导数就是常见的例 ...

随机推荐

  1. Set和Map数据结构

    1.Set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. 2.Map JavaScript 的对象 ...

  2. 2.22 JS处理富文本

    2.22 JS处理富文本 前言    <富文本>这篇解决了富文本上iframe问题,其实没什么特别之处,主要是iframe的切换,本篇讲解通过js的方法处理富文本上iframe的问题一.加 ...

  3. 20165228 2017-2018-2 《Java程序设计》第3周学习总结

    20165228 2017-2018-2 <Java程序设计>第3周学习总结 教材学习内容总结 编程语言 面向机器语言:机器能直接识别的语言, 其指令由特定的二进制码表示. 其中汇编语言是 ...

  4. dubbo ActivateExtension

    对于集合类扩展点,比如:Filter, InvokerListener, ExportListener, TelnetHandler, StatusChecker等, 可以同时加载多个实现,此时,可以 ...

  5. Django中的应用

    1.什么是应用 应用就是网站中的一个独立的程序模块,在Django中,主目录一般不处理具体的请求,主目录一般要处理的是项目的初始化操作以及请求的分发(分布式请求处理).而具体的请求是由各个应用去处理. ...

  6. Unity 思考问题的办法

    Unity 思考问题的办法 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  7. CF453(Div1 简单题解)

    A .Little Pony and Expected Maximum pro:给定M,N,表示一个M面的骰子,甩N次,问出现的最大的数的期望. sol:容斥,f(i)表示最大数<=i的期望,那 ...

  8. Gym - 101981M:(南京) Mediocre String Problem(回文树+exkmp)

    #include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) using ...

  9. JavaScript 如何断平台

    isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgen ...

  10. php-fpm的pool池子、php慢日志记录、open_basedir、php-fpm进程管理

    1.php-fpm的poo池子:目的:可以让不同的网站,对于不同的php解析,可以把不同的网站解析区分开.编辑:vim /usr/local/php5-fpm/etc/php-fpm.conf加入: ...