美文网首页
使用JS闭包来实现once函数

使用JS闭包来实现once函数

作者: shengbeiniao | 来源:发表于2017-12-13 17:13 被阅读0次

直接上代码

let _={
  once:function (f) {
    //计数器,采用闭包来保护私有变量
    let count=0;
    //保存闭包执行结果
    let result;
    return function () {
      count++;
      //once执行逻辑
      if(count===1){
        //采用apply执行函数
        result=f.apply({},arguments);
      }
      //返回函数执行结果
      return result;
    }
  }
};

let f=function (name) {
  console.log(name);
};

let t=_.once(f);

t('frank');
t('brenda');

#result
frank

上面的代码有一个缺陷,就是忽略了this的处理,在apply的时候直接指定了空对象,考虑如下调用

let f=function () {
  console.log(this.name);
};

let o={
  name:'frank',
  f:f
};

let t=_.once(o.f);

t();
t();

console输出undefined,显然不符合预期,重新改造后的代码如下

let _={
  once:function (f,_this) {
    let count=0;
    let result;
    return function () {
      count++;
      if(count===1){
        if(typeof _this==='undefined'){
          _this={};
        }
        result=f.apply(_this,arguments);
      }
      return result;
    }
  }
};

let f=function () {
  console.log(this.name);
};

let o={
  name:'frank',
  f:f
};

let t=_.once(o.f,o);

t();
t();

#result 
frank

相关文章

  • 使用JS闭包来实现once函数

    直接上代码 上面的代码有一个缺陷,就是忽略了this的处理,在apply的时候直接指定了空对象,考虑如下调用 co...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • js使用foreach遍历数组的坑

    js使用foreach遍历数组的坑,无法使用 return 语句来从闭包函数中返回

  • 06.实现一个累加器

    使用构造函数和对象的方式,实现累加器:本质上还是闭包 使用闭包实现一个累加器闭包

  • 前端面试题(持续补充)

    js,node.js基础: 闭包 闭包是能够读取其他函数内部变量的函数。在js中,只有函数内部的子函数可以访问内部...

  • 闭包

    关键词:闭包(closure) 概念:闭包就是能够读取其他函数内部变量的函数,对于js,闭包就是将函数内部和函数外...

  • 闭包(Closure)

    闭包:指有权访问另一个函数作用域中的变量的函数闭包实现条件:内部函数使用了外部函数的变量、外部函数已退出、内部函数...

  • C++ ---- 闭包

    什么是闭包 能够读取其他函数内部变量的函数。 lambda表达式实现闭包 使用bind函数 有兴趣可看这个知乎,传...

  • 2018-01-10

    js中的闭包 一.什么是闭包 闭包官方的解释是:闭包就是能够读取其他函数内部变量的函数。由于在javascr...

  • 关于js的函数表达式(第七篇)

    1.函数表达式的特征 2.使用函数实现递归 3. 使用闭包定义私有变量 函数表达式是js中一个强大又让人困惑的特性...

网友评论

      本文标题:使用JS闭包来实现once函数

      本文链接:https://www.haomeiwen.com/subject/jmlzixtx.html