实现lazyMan

涉及的知识点:

  1. 流程控制:创建task任务队列,使用push、shift、unshift方法操作任务
  2. 闭包:当闭包中的值引用自闭包外部,那么这些值会始终存放在内存中。下面例子中的nametime都会保存在内存中,不至于访问时为undefined
      function _lazyMan (name) {

        // 创建一个任务队列
        this.task = [];
        let self = this;

        let fn = (function (name) {
          return function () {
            console.log(`Hi! This is ${name}!`);
            // 执行下一个任务
            self.next();
          };
        })(name);
        this.task.push(fn);
        // 在下一个事件循环启动任务
        setTimeout(function () {
          self.next();
        }, 0);
      }

      _lazyMan.prototype.next = function () {
        let fn = this.task.shift();
        fn && fn();
      };

      _lazyMan.prototype.sleepFirst = function (time) {
        let self = this;
        let fn = (function (time) {
          return function () {
            setTimeout(function () {
              console.log(`Wake up after ${time}s!`);
              self.next();
            }, time * 1000);
          }
        })(time);
        this.task.unshift(fn);
        return this;
      }

      _lazyMan.prototype.sleep = function (time) {
        let self = this;
        let fn = (function (time) {
          return function () {
            setTimeout(function () {
              console.log(`Wake up after ${time}s!`);
              self.next();
            }, time * 1000);
          }
        })(time);
        this.task.push(fn);
        return this;
      }

      _lazyMan.prototype.eat = function (name) {
        let self = this;
        let fn = (function (name) {
          return function () {
            console.log(`Eat ${name}~`)
            self.next();
          }
        })(name);
        this.task.push(fn);
      }

      function lazyMan (name) {
        return new _lazyMan(name);
      }

      lazyMan('17khba').sleepFirst(10).eat('lunch');
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,272评论 0 4
  • 第三章 类型、值和变量 1、存取字符串、数字或布尔值的属性时创建的临时对象称做包装对象,它只是偶尔用来区分字符串值...
    坤少卡卡阅读 661评论 0 1
  • 可能很多时候 人生没有那么圆满 我错过了二十岁 一心要娶的人 甚至八十岁 还要面对夕阳编织的遗憾 也许时间从来不是...
    WXY等阅读 198评论 0 1
  • 昨天晚上跑完步的在拉伸的时候突然想起好像有几天没给爸爸打电话,于是一边拉伸一边给爸爸打电话。 “爸,吃饭了没有?”...
    向行阅读 413评论 0 2