前言

前几天在稀土上看到一篇面试的帖子,里面微信有一道题是lazyman的实现,具体要做的事情就是

LazyMan(“Hank”)
//Hi! This is Hank!LazyMan(“Hank”).sleep(10).eat(“dinner”)
// Hi! This is Hank!
// 等待10秒..
// Wake up after 10
// Eat dinner~LazyMan(“Hank”).eat(“dinner”).eat(“supper”)
// Hi This is Hank!
// Eat dinner~
// Eat supper~LazyMan(“Hank”).sleepFirst(5).eat(“supper”)
// 等待5秒
// Wake up after 5
// Hi This is Hank!
// Eat supper

这道题考察的肯定不是实现这个函数的能力问题,应该是流程控制的问题。解决思路应该是将所有的人如都存放到一个数组中,并在所有的方法执行完之后一次性的输出,实现的代码如下:

function _LazyMan(name) {this.tasks = [];   var self = this;var fn =(function(n){var name = n;return function(){console.log("Hi! This is " + name + "!");self.next();}})(name);this.tasks.push(fn);setTimeout(function(){self.next();}, 0); // 在下一个事件循环启动任务
}
/* 事件调度函数 */
_LazyMan.prototype.next = function() { var fn = this.tasks.shift();fn && fn();
}
_LazyMan.prototype.eat = function(name) {var self = this;var fn =(function(name){return function(){console.log("Eat " + name + "~");self.next()}})(name);this.tasks.push(fn);return this; // 实现链式调用
}
_LazyMan.prototype.sleep = function(time) {var self = this;var fn = (function(time){return function() {setTimeout(function(){console.log("Wake up after " + time + "s!");self.next();}, time * 1000);}})(time);this.tasks.push(fn);return this;
}
_LazyMan.prototype.sleepFirst = function(time) {var self = this;var fn = (function(time) {return function() {setTimeout(function() {console.log("Wake up after " + time + "s!");self.next();}, time * 1000);}})(time);this.tasks.unshift(fn);return this;
}
/* 封装 */
function LazyMan(name){return new _LazyMan(name);
}

我自己在思考解决方法的时候最让我困惑的就是如果判断Lazyman对象的方法被调用结束了?我甚至为了这个问题坐过了站。。。后来当我看到这段代码的时候,发现一个简单的setTimeout就解决了这个问题,为什么呢???

并发模型与Event Loop

这张图是MDN对Event Loop的解释,这张图上分为三个部分,分别是队列、栈、和堆。我们在理解lazyman的过程中需要知道的就是队列和栈。首先我们来讲这个栈:

在js中,每当有函数被执行的时候都会在当前的执行堆栈中创建一个新的堆栈帧,并放到栈顶。这个堆栈帧中包含当前执行的函数的参数和局部变量。(有没有感觉很熟悉,没错,这就是我们理解作用域链的时候的那个栈)而当我们的函数执行完之后,这个堆栈帧就会从当前栈中移除。

队列就是JS中用来处理异步事件的队列,每当有新的异步事件发生,就会添加一个新的消息到队列的尾部。当之前提到的栈为空时,JS就会来处理队列中的消息。

举个例子来说就是:

var a = function() {setTimeout(function(){console.log(1)},0)
}
var b = function(){a()console.log(2)
}
// 2
// 1

这里需要注意的有

  1. 就算你不在函数中使用setTimeout,而是在全局环境中使用,setTimeout也是在正常的同步代码执行完之后执行,这是因为还有宿主环境在。

  2. setTimeOut是经过一段时间之后直接向队列中加入一个消息,而普通的http请求是等到有返回结果了才会将消息加入到队列中。

  3. 普通的异步事件如果没有事件监听器的话是不会操作队列的,消息是直接被忽视掉。

Lazyman中的setTimeout

Lazyman中的`setTimeout不是单单的在函数中执行,而是在对象链式调用中执行。因为是链式调用,所以代码一直在同一个作用于中执行,也就是说当前的堆栈帧一直没有被移出栈。上面的代码中就是利用了这个特点解决了如何判断对象调用结束的问题。

关于lazyman你还应该知道这几件事相关推荐

  1. 裁员之外,京东还在偷偷做这件事

    对于急于探寻科技转型的京东而言,区块链这块兵家必争之地必然不甘心错过,京东的区块链野望更是不容小觑. 文 |  昕楠 出品 |  Odaily星球日报(ID:o-daily) 京东正在追赶BAT. 4 ...

  2. keyshot卡住了还能保存吗_相机希望你知道的13件事 keyshot相机切换事件

    一次我去我学校的球场看足球比赛,遇见一对父母,他们在为自己的孩子拍摄,全程用自动挡,还对着几百米远奔跑的儿童开闪光灯!老实说作为一名严肃的摄影爱好者我有深深的强迫症,于是忍不住就上去跟他们聊开手把手教 ...

  3. 创业负债累累 | 失败了的我还如何翻盘?是天台见! 我的故事还只是从这件事开始...

    人生的低估期应该怎么度过? 下面这个心法,是测试君花费了0.5个W,在一个培训营学到的,答案很简单. 先把你生活中的事情,分为3大类: ● 完全能掌控的--(投入全部精力.财力)● 只能掌控一部分的- ...

  4. 注意啦,还没有支持64位系统的App开发者,务必在12月底前完成这件事

    注意啦!还没有支持64位系统的App开发者务必在12月底前完成这件事! 近日,国内五大应用商店宣布,将共同推进国内安卓生态对64位架构的升级支持,目的是更好提升APP性能体验并降低功耗. 友盟+ U- ...

  5. 明知道员工不喜欢干一件事,干不好一件事,你还一定要他去干,犯贱就贱在和员工讲道理争输赢,有意思吗?人尽其才,物尽其用(转)...

    下午员工辞职了,我又成了"光杆司令"一枚.谨以此文记. 导火索是因为他坚持他的看法,我不同意.我告诉他,这个问题没有这么简单,我们把它单列出来放在一边,先把其他的事情做了.他不以为 ...

  6. 手机上的三件事别乱去做,一不留神就会中毒,现在了解还来得及

    当下互联网发展迅速,处于大数据时代的我们可以说已经没什么安全感可言了.在智能手机发展的路途中,想必大家都听过看过不少.手机中存在着很多安全隐患,有时候在不经意间我们的手机就会被病毒入侵. 在我们的手机 ...

  7. 你写的ML代码占多少内存?这件事很重要,但很多人还不懂

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Tirthajyoti Sarkar 本文转载自:机器之心  ...

  8. 归纳推理测试没做完_敷完面膜不要做4件事,不但敷了面膜没效果,皮肤还变差了...

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到内容了.每天都有分享.完全是免费订阅,请放心关注. 夏天最惬意的事是什么呢?必须是洗完脸后,来张面膜贴 ...

  9. 还在为数学建模的事发愁?带你一起来看看数模竞赛中必备的经典算法

    前言 数学建模比赛是本科生和研究生阶段最重要的比赛之一,包括全国大学生数学建模竞赛(俗称"国赛")和美国大学生数学建模竞赛(俗称"美赛").在这些比赛中取得好成 ...

最新文章

  1. DeepFaceDrawing: 使用草图生成人脸图像
  2. python项目中无法import不同文件的代码
  3. FlexPaper不能跨服务器加载远程文件解决办法
  4. mysql 5.1.62_MySQL 5.5.62 安装方法(标准配置版)
  5. 在Nginx上配置NameCheap免费SSL
  6. ORC 在 Hive 中的应用
  7. V模型、W模型、测试工具的介绍
  8. RapidMiner介绍与实践(一)决策树
  9. RGB配色表,CMYK配色表
  10. unity构建游戏场景
  11. Tox21数据集学习笔记
  12. python定时发送qq消息_自动给qq好友发消息
  13. c语言 称重系统设计,智能称重系统设计-文献综述.doc
  14. 【题解刷题总结】青蛙的约会
  15. 思科CCNA认证课程内容
  16. 织梦模板之家:如何安装更换织梦cms模板
  17. WebView加载网页空白问题
  18. catia 螺钉外螺纹_请问catia如何画螺杆和螺栓上的螺纹
  19. 结合Bootstrap实现头像上传前预览
  20. 随手记提交自查报告,随手记理财靠谱性再进一步!

热门文章

  1. 同样可以建站,云服务器和虚拟主机的区别在哪?
  2. Java ---- baidu评价抽取关键词-商品评论
  3. posix,perl正则表达式区别
  4. lighttpd 之防盗链
  5. 20170521第三讲
  6. EasyUI 异步Tree
  7. java 环境 搭建
  8. linux系统常用操作命令
  9. 周志华-机器学习西瓜书-第三章习题3.3 编程实现对率回归
  10. python判断一个数是不是完全平方数