js面试题关键字区别事件循坏同步异步

let const var区别

在JavaScript中,let、const和var是用于声明变量的关键字,它们之间存在一些差异。以下是详细介绍:

  • var。在ES5及之前的版本中,使用var关键字声明变量。它的特点包括函数作用域,即变量的作用域仅限于声明它的函数内部;变量提升,即在声明变量之前使用它不会报错,但值默认为undefined;可以重复声明同一个变量。
  • let。在ES6中引入的let关键字用于声明块级作用域的变量。它的特点包括块级作用域,即变量只在当前代码块内有效;不可重复声明,即同一个作用域内不能多次声明同一个变量;没有变量提升,即在声明语句之前使用它会导致ReferenceError错误。
  • const。在ES6中引入的const关键字用于声明常量。它的特点包括块级作用域,即常量只在当前代码块内有效;常量一旦被赋值就不能修改,尝试修改会抛出TypeError错误;不可重复声明,即同一个作用域内不能多次声明同一个常量。

综上所述,三者的主要区别在于变量作用域、变量提升和变量重复声明。通常推荐使用let和const来声明变量,以避免变量提升和重复声明等问题,从而使得代码更加安全和规范.

js 同步与异步

首先JavaScript语言的一大特点就是单线程,即(同一时间只能做一件事情),同步任务即阻塞模式。 异步任务即非阻塞模式。 同步任务都在主线程上执行,形成一个执行栈。

异步任务(js的异步是通过回调函数实现的放入到消息队列中比如:

① 普通的事件。click、resize等

② 资料加载,load、error 等

③ 定时器,setInterval、setTimeout等

执行顺序:

①先执行执行栈中的同步任务

② 异步任务(回调函数)放入任务队列中

③ 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。

事件循环

我们把任务分为同步任务和异步任务。js把异步任务分为宏任务和微任务

在es5之后,JavaScript引入了promise,这样不需要浏览器,JavaScript引擎自身也能够发起异步任务了。

宏任务 由(浏览器、node发起)、 微任务 由(js引擎发起的任务)比如promise(Promise本身是同步的,then/catch的回调函数是异步的)

所以我们把代码可能分为3种

① 同步代码(js执行栈/回调栈)

② 微任务的异步代码(js引擎) process.nextTick (node) promise.then( ) catch( )

Async/Await Object.observer等等

③ 宏任务的异步代码 script(代码块) setTimeout/ setInterval定时器 setImmediate 定时器

再看三种代码的执行顺序: 同步代码 →微任务的异步代码(promise等) →宏任务的异步代码(setTimeout/ setInterval等)

什么是事件循环?调用堆栈和任务队列之间有什么区别?

事件循环是一个单线程循环,用于监视调用堆栈并检查是否有工作即将在任务队列中完成。如果调用堆栈为空并且任务队列中有回调函数,则将回调函数出队并推送到调用堆栈中执行。

相关推荐
IT_陈寒2 小时前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
默_笙2 小时前
🚓 分诊台与拆题术:让 RAG 学会判断和规划
前端·javascript
卷福同学2 小时前
第一次当面试官有感
后端·面试
CopyCode2 小时前
用 AI 迁项目有多爽?我把 Webpack 迁 Vite 的全过程记下来了
前端·架构
去伪存真2 小时前
Electron 自动化发布指南:GitHub Actions 跨平台打包全纪录
前端·electron
计算机魔术师2 小时前
OpenAI智能体失控闯进美国政府网站,53张用户图片外泄背后
前端
颜进强2 小时前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
程序员Flycan2 小时前
🚀 跨域终结者:前端代理服务器(Proxy)原理解析与配置总结
前端
怕浪猫2 小时前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
huakoh2 小时前
MCP 报错分不清?先看响应里是 result 还是 error
前端