前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

once

作者头像
公众号@魔术师卡颂
发布2020-08-26 23:38:22
3710
发布2020-08-26 23:38:22
举报

确保函数只会被调用一次。


产生一个闭包,在闭包中保存一个标记变量called用于判断目标函数是否已经调用过。

通过该标记变量确保函数只会被调用一次。

为了允许函数可以改变其this指向(例如在事件监听回调中),这里使用function关键字声明返回的函数,并且为需要调用的函数绑定this指向。

使用扩展运算符...使函数可以接受任意数量的参数。

const once = fn => {
  let called = false;
  return function(...args) {
    if (called) return;
    called = true;
    return fn.apply(this, args);
  };
};

例子

const startApp = function(event) {
  // document.body, MouseEvent
  console.log(this, event); 
};

// 点击事件触发时startApp只会执行一次
document.body.addEventListener('click', once(startApp)); 

扩展阅读

React源码中,同样利用了闭包保存标记变量的特性来标记目标函数的执行优先级.

function runWithPriority(priorityLevel, eventHandler) {
  var previousPriorityLevel = currentPriorityLevel;
  currentPriorityLevel = priorityLevel;

  try {
    return eventHandler();
  } finally {
    currentPriorityLevel = previousPriorityLevel;
  }
}

runWithPriority方法接收一个优先级变量priorityLevel和一个回调函数eventHandler

eventHandler执行前先将当前执行上下文的currentPriorityLevel保存在previousPriorityLevel

接下来将currentPriorityLevel赋值为传入的priorityLevel,并在eventHandler调用结束后恢复currentPriorityLevelpreviousPriorityLevel

这样,在eventHandler调用栈中获取的currentPriorityLevel始终为runWithPriority的传参priorityLevel

通过这样的方式,React得以区分不同交互事件产生的更新优先级

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 魔术师卡颂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例子
  • 扩展阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档