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等)

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