首页 > 其他分享 >前端入栈和出栈

前端入栈和出栈

时间:2023-11-29 17:47:35浏览次数:28  
标签:出栈 log 队列 前端 事件 执行 入栈

在编程中,事件入栈(Event Pushing)和出栈(Event Popping)通常与事件循环(Event Loop)和消息队列(Message Queue)相关。这些概念在前端开发中尤其重要,特别是在处理异步事件和回调函数时。下面我将解释这些概念,并提供一些代码示例。

事件循环(Event Loop)

事件循环是JavaScript运行时环境的一部分,它负责协调事件、用户交互、脚本执行、渲染、网络请求等。JavaScript是单线程语言,事件循环使得它能够执行非阻塞操作。

消息队列(Message Queue)

消息队列是一个先进先出(FIFO)的数据结构,用于存储待处理的事件。这些事件可能是用户交互(如点击、滚动等)、定时器超时、网络请求完成等。

事件入栈(Event Pushing)

当一个事件发生时,如用户点击了一个按钮,这个事件会被创建并放入消息队列的末尾。这个过程称为事件入栈。

// 假设这是一个用户点击事件的处理函数
function handleClick() {
  console.log('Button clicked!');
}

// 用户点击按钮时,handleClick事件被放入消息队列
button.addEventListener('click', handleClick);

事件出栈(Event Popping)

事件循环会不断检查消息队列。如果队列非空,并且主线程(当前执行栈)空闲,事件循环会将消息队列中的第一个事件出栈,并执行其回调函数。

// 事件循环的简化示意
while (true) {
  if (messageQueue.isNotEmpty() && mainThread.isIdle()) {
    let event = messageQueue.dequeue(); // 出栈
    event.callback(); // 执行回调
  }
}

示例

下面是一个简单的例子,演示了定时器事件如何入栈和出栈:

console.log('Script start');

setTimeout(function timeoutCallback() {
  console.log('Timeout occurred');
}, 0);

console.log('Script end');

// 输出顺序:
// Script start
// Script end
// Timeout occurred

在这个例子中,即使setTimeout的延迟时间设置为0,回调函数timeoutCallback也不会立即执行。首先,当前的执行栈(同步代码)必须完成执行,即打印"Script start"和"Script end"。然后,事件循环会从消息队列中取出定时器事件,并执行其回调函数,打印"Timeout occurred"。

希望这些解释和示例能帮助你理解事件入栈和出栈的概念。

实战:

export const stack:any = []

export function executeFunctionFromString(functionString?:string, args?: any[]) {
  if (functionString) {
    if ((window as any).log) {
      try {
        var fn = eval("(" + functionString + ")");
        fn(...(args || []));
      } catch (error) {
      }
    } else {
      stack.push(function() {
        var fn = eval("(" + functionString + ")");
        fn(...(args || []));
      });

      function executeStack() {
        if (stack.length > 0) {
          setTimeout(function() {
            if ((window as any).log) {
              // 出栈并执行
              let fn = stack.pop();
              fn();
            } else {
              executeStack()
            }
          }, 1000);
       }
      }
      executeStack()
    }
  }
} 

这个场景是需要通过npm传递函数,所以把函数转换成字符串,接受后再转换成函数。但出现一个问题,就是执行的需要依赖log,但是log又需要出示化后才能用,所以就把事件入栈,等1秒后在执行,如果有log就执行然后事件出栈,没有的话在等1秒后执行。

标签:出栈,log,队列,前端,事件,执行,入栈
From: https://www.cnblogs.com/bagexiaowenti/p/17865438.html

相关文章

  • 微前端 qiankun
    三个项目,一个管理端,两个微前端文档地址 https://qiankun.umijs.org/zh普通项目管理端安装qiankun   npmiqiankun-S管理端main.jsimportVuefrom'vue'importAppfrom'./App.vue'Vue.config.productionTip=false//引入qiankunimport{ registerMicroApps......
  • 前端路由及两种实现方式
    路由的概念来源于服务端,在服务端中路由描述的是URL与处理函数之间的映射关系,当然也会处理不同的URL来展示不同的视图界面。随着Ajax的盛行,无刷新交互成为了当下的主流,我们更希望在无刷新的情况下完成不同URL来展示不同的视图界面,即在一个页面中完成路由的切换(俗称:单页面应用开......
  • get /post后端获取前端int型数据
    首先post能传过去数据其次传过去的数据全部都是string类型的所以我们如果想要获取int型数据就得把传过去的string转换成int型转换只能用下面这个函数其他的试过了都不行必须用Integer.parsenInt其他的valueof之类的都不可以,这个错误主要是我向后端数据库提交数据的时候插入的数......
  • 记录后端不同请求方式的接口,使用vue3框架下的前端axio请求不同写法
    一.后端接口:@GetMapping("/index")publicResponseResultindex(){..} 前端接口:indexInfo().then(res=>{if(res.data.code==200){ElNotification({message:res.data.data.msg||"加载成功",ty......
  • VUE前后端分离项目,前端打包,可配置修改环境变量文件,无需再次打包
      懒得打字了,直接截图,转载自:https://blog.csdn.net/CSDN_33901573/article/details/130603111        ......
  • 前端歌谣的刷题之路-第一百零五题-监听对象
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 从前端的角度来梳理微信支付(小程序、H5、JSAPI)的流程
    因业务需要,开发微信支付功能,涉及三种支付方式:JSAPI支付:微信内网页支付,需要开通微信服务号小程序支付:在小程序中支付,需要开通小程序H5支付:在手机浏览器(出微信内网爷)中网页支付使用微信支付的前提必开通微信商户号,要使用到那种的支付方式要前需在商户平台开通(要审核)。支付......
  • vue前端截图
    <template><divclass="bigbox"> <divclass="box"ref="imageTest"> <divclass="boxTop"> 13653197159邀请您注册 <spanstyle="color:#5FFFB7;">金猫矿池</span> </div>......
  • 飞码LowCode前端技术之画布的设计
    简介本章节从精准定位、分层设计、异步组件、拖拽四个方面分析飞码画布设计。一、精准定位设计飞码画布是一个套件,可对外提供画布能力。精准定位有两种情况,一是目标组件无子组件,而是目标组件有子组件。无子组件:目标组件分为支持与不支持放子组件两种情况。有子组件:鼠标相对于......
  • 前端歌谣的刷题之路-第一百题-控制动画
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......