Javascript 闭包与高阶函数 ( 二 )
在上一篇 Javascript 闭包与高阶函数 ( 一 )中介绍了两个闭包的作用。 两位大佬留言指点,下来我会再研究闭包的实现原理和Javascript 函数式编程 。
今天接到头条 HR 的邮件,真是超级开心呐,希望熬过一个周后一切顺利 ~
这一篇,继续举一些闭包的常见例子 。
提取this
我们常常需要面临下面的业务场景
var push = Array.prototype.push;
var a = [];
push.call(a, 1);
console.log(a); // 1
这样固然可行,可是 我们有时候更想进行下面的操作
var a = [];
push(a, 1);
console.log(a); // 1
这应该怎么做呢? 思路就是将a 提取出来作为this,然后调用Array.prototype.push 方法 。
Function.prototype.uncharrying = function() {
var self = this;
return function() {
var _this = Array.prototype.shift.call(arguments);
return self.apply(_this, arguments);
}
}
var push = Array.prototype.push.uncharrying();
var a = [];
push(a, 1);
console.log(a);

函数节流
在很多业务场景中,比如 window.onresize 或者一些轮播图组件中,为了防止不断触发,都会使用一个函数节流的操作。下面看一个最简单的函数节流
var flag = false;
window.resize = function(e){
if(flag) {
return;
}
setTimeout(function(){
... // 业务逻辑代码
flag = false;
},1000);
flag = true;
}
这样做可用,但是缺点很多 。
下面用一个闭包将其包装起来 。
window.resize = (function(e){
var flag = false;
return function(){
if(flag) {
return;
}
setTimeout(function(){
... // 业务逻辑代码
flag = false;
},1000);
flag = true;
}
})();
看起来更加优优雅一点 。如果把节流的函数单独剥离呢??下面是完整代码
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 );
}, 500 );
分时函数
与函数节流不同,分时函数用来限制函数调用的次数,用来提供页面性能 。
一个例子是创建 WebQQ的 QQ好友列表。列表中通常会有成百上千个好友,如果一个好友
用一个节点来表示,当我们在页面中渲染这个列表的时候,可能要一次性往页面中创建成百上千个节点。
在短时间内往页面中大量添加 DOM节点显然也会让浏览器吃不消,我们看到的结果往往就
是浏览器的卡顿甚至假死 。
这时候就需要分时函数,每隔一段时间运行一段 。
'use strict';
var timeChunk = function(argsAry, fn, count) {
var interval;
var exec = function() {
var l = argsAry.length;
for (var i = 0; i < Math.min(count || 1, l); i++) {
var arg = argsAry.shift();
fn(arg);
}
}
return function() {
interval = setInterval(function() {
var flag = exec();
if (argsAry.length === 0) {
clearInterval(interval);
interval = null;
}
}, 500)
}
};
var a = [],func;
for (var i = 0; i < 36; i++) {
a.push(i);
}
func = timeChunk(a, function(i) {
console.log(i);
}, 10)
func();

闭包和高阶函数的应用非常广泛,很多设计模式都是通过闭包和高阶函数来实现的 。
希望此文可以对你有帮助 。
转载请声明本文出处: http://www.cnblogs.com/likeFlyingFish/p/6426892.html
Javascript 闭包与高阶函数 ( 二 )的更多相关文章
- Javascript 闭包与高阶函数 ( 一 )
上个月,淡丶无欲 让我写一期关于 闭包 的随笔,其实惭愧,我对闭包也是略知一二 ,不能给出一个很好的解释,担心自己讲不出个所以然来. 所以带着学习的目的来写一写,如有错误,忘不吝赐教 . 为什么要有闭 ...
- JavaScript之闭包与高阶函数(一)
JavaScript虽是一门面向对象的编程语言,但同时也有许多函数式编程的特性,如Lambda表达式,闭包,高阶函数等. 函数式编程是种编程范式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 ...
- JavaScript ES6函数式编程(一):闭包与高阶函数
函数式编程的历史 函数的第一原则是要小,第二原则则是要更小 -- ROBERT C. MARTIN 解释一下上面那句话,就是我们常说的一个函数只做一件事,比如:将字符串首字母和尾字母都改成大写,我们此 ...
- [Node.js] 闭包和高阶函数
原文地址:http://www.moye.me/2014/12/29/closure_higher-order-function/ 引子 最近发现一个问题:一部分写JS的人,其实对于函数式编程的概念并 ...
- JavaScript进阶之高阶函数篇
JavaScript进阶之高阶函数篇 简介:欢迎大家来到woo爷说前端:今天给你们带来的是JavaScript进阶的知识,接下来的系列都是围绕着JavaScript进阶进行阐述:首先我们第一篇讲的是高 ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- 如何在JavaScript中使用高阶函数
将另一个函数作为参数的函数,或者定义一个函数作为返回值的函数,被称为高阶函数. JavaScript可以接受高阶函数.这种处理高阶函数的能力以及其他特点,使JavaScript成为非常适合函数式编程的 ...
- javascript设计模式学习之三—闭包和高阶函数
一.闭包 闭包某种程度上就是函数的内部函数,可以引用外部函数的局部变量.当外部函数退出后,如果内部函数依旧能被访问到,那么内部函数所引用的外部函数的局部变量就也没有消失,该局部变量的生存周期就被延续. ...
- 《JavaScript设计模式与开发实践》——第3章 闭包和高阶函数
闭包 变量的作用域和生存周期密切相关 高阶函数 函数可以作为参数被传递 函数可以作为返回值输出
随机推荐
- displayport-2
上一章讲述了display-port的硬件连接,今天来说说协议层 图中可以看到,最底层是物理层,上层是连接服务层,提供的服务包括同步数据传输服务,aux链接服务,aux设备数据传输服务,在设备端也一样 ...
- LPC2478的硬件IIC使用
LPC2478的IIC使用 LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示, 简单 ...
- 直流电机驱动PWM频率(转)
源:直流电机驱动PWM频率 1.没有统一的标准,其实PWM的频率和你的电机感抗和你需要的速度响应时间有很大的关系.一般的电机用14K就足够了.当然自需要简单的调速可以随便选. 如果电机转速比较高,感抗 ...
- iOS搜索框UISearchBar 分类: ios技术 2015-04-03 08:55 82人阅读 评论(0) 收藏
当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...
- python threading模块中对于信号的抓取
最近的物联网智能网关(树莓派)项目中遇到这样一个问题:要从多个底层串口读取发来的数据,并且做出相应的处理,对于每个串口的数据的读取我能想到的可以采用两种方式: 一种是采用轮询串口的方式,例如每3s向每 ...
- UVa 369 - Combinations
题目大意:给两个数n, m,求C(n, m).用java直接写就好了. import java.io.*; import java.util.*; import java.math.*; class ...
- Unity3D ——强大的跨平台3D游戏开发工具(一)
众所周知,Unity3D是一个能够实现轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎.在现有的版本中,其强大的游戏制作功能已 经达到让人瞠目结舌的地步.尤其是它在3.0版本里面制作的那款 ...
- BZOJ 1455: 罗马游戏 [可并堆]
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1715 Solved: 718[Submit][Status][Discuss] ...
- iOS 错误 之 http请求
Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is ins ...
- 如何解决PHP+MySQL出现乱码的现象
在使用PHP+MYSQL时,您是否遇到过字符乱码的问题呢?您是如何解决这个问题的呢?这里提供了一种解决之道. 在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据 ...