返回顶部
首页 > 资讯 > 前端开发 > JavaScript >用几道面试题来看JavaScript执行机制
  • 264
分享到

用几道面试题来看JavaScript执行机制

2024-04-02 19:04:59 264人浏览 泡泡鱼
摘要

目录前面的话同步和异步开胃菜加一盘宏任务 微任务来一盘Promise再加点定时器简单测试总结前面的话 根据javascript的运行环境,锁定它为单线程,任务需要排队执行,如果网站资

前面的话

根据javascript的运行环境,定它为单线程,任务需要排队执行,如果网站资源比较大,这样会导致浏览器加载会很慢,但实际上并没有,大家肯定立刻想到了同步和异步。

所谓的同步和异步也是在排队,只是排队的地方不同。

同步和异步

同步任务进入主线程排队,异步任务进入事件队列中排队

同步任务和异步任务进入到不同的队列中,也就是上面讲的在不同地方排队。

同步任务进入主线程,异步任务进入事件队列,主线程任务执行完毕,事件队列中有等待执行的任务进入主线程执行,直到事件队列中任务全部执行完毕。

开胃菜


console.log('a')

setTimeout(function(){
    console.log('b')
}, 200)

setTimeout(function(){
    console.log('c')
}, 0)

console.log('d')

a d c b

从上到下,该进入主线程的进入主线程,该进入事件队列的进入事件队列。

那么主线程中存在console.log('a')和console.log('d'),定时器setTimeout延迟一段时间执行,顾名思义异步任务进入事件队列中,等待主线程任务执行完毕,再进入主线程执行。

定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的进入主线程中执行。

加一盘


for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i)
    }, 1000)
}

结果:十个10

每次for循环遇到setTimeout将其放入事件队列中等待执行,直到全部循环结束,i作为全局变量当循环结束后i = 10,再来执行setTimeout时i的值已经为10, 结果为十个10。

将var改为let,变量作用域不同,let作用在当前循环中,所以进入事件队列的定时器每次的i不同,最后打印结果会是 0 1 2...9。

宏任务 微任务

除了经常说的同步任务和异步任务之外,更可分为宏任务,微任务

主要宏任务:整段脚本scriptsetTimeoutsetTimeout...

主要微任务:promise.then...

执行流程:

1.整段脚本script作为宏任务开始执行

2.遇到微任务将其推入微任务队列,宏任务推入宏任务队列

3.宏任务执行完毕,检查有没有可执行的微任务

4.发现有可执行的微任务,将所有微任务执行完毕

5.开始新的宏任务,反复如此直到所有任务执行完毕

来一盘Promise


const p = new Promise(resolve => {
    console.log('a')
    resolve()
    console.log('b')
})

p.then(() => {
    console.log('c')
})

console.log('d')

结果:a b d c

1.整段script进入宏任务队列开始执行

2.promise创建立即执行,打印ab

3.遇到promise.then进入微任务队列

4.遇到console.log('d')打印d

5.整段代码作为宏任务执行完毕,有可执行的微任务,开始执行微任务,打印c。


setTimeout(function(){
    console.log('setTimeout')
}, 0)

const p = new Promise(resolve => {
    console.log('a')
    resolve()
    console.log('b')
})

p.then(() => {
    console.log('c')
})

console.log('d')

结果:a b d c setTimeout

1.setTimeout进入宏任务队列

2.promise创建立即执行,打印ab

3.遇到promise.then进入微任务队列

4.遇到console.log('d')打印d

5.有可执行的微任务,打印c

6.微任务执行完毕,开始执行新的宏任务,setTimeout开始执行,打印setTimeout


setTimeout(function(){
    console.log('setTimeout')
}, 0)

const p = new Promise(resolve => {
    console.log('a')
    resolve()
    console.log('b')
})

p.then(() => {
    console.log('c')
    setTimeout(function(){
        console.log('then中的setTimeout')
    }, 0)
})

console.log('d')

结果:a b d c setTimeout then中的setTimeout

1.同上

2.执行微任务打印c,遇到setTimeout将其推入宏任务队列中

3.定时器延迟时间相同,开始按照顺序执行宏任务,分别打印setTimeoutthen中的setTimeout

再加点定时器


console.log('a');

new Promise(resolve => {
    console.log('b')
    resolve()
}).then(() => {
    console.log('c')
    setTimeout(() => {
      console.log('d')
    }, 0)
})

setTimeout(() => {
    console.log('e')
    new Promise(resolve => {
        console.log('f')
        resolve()
    }).then(() => {
        console.log('g')
    })
}, 100)

setTimeout(() => {
    console.log('h')
    new Promise(resolve => {
        resolve()
    }).then(() => {
        console.log('i')
    })
    console.log('j')
}, 0)

结果:a b c h j i d e f g

1.打印a

2.promise立即执行,打印b

3.promise.then推入微任务队列

4.setTimeout推入宏任务队列

5.整段代码执行完毕,开始执行微任务,打印c,遇到setTimeout推入宏任务队列排队等待执行

6.没有可执行的微任务开始执行宏任务,定时器按照延迟时间排队执行

7.打印h j,promise.then推入微任务队列有

8.可执行的微任务,打印i,继续执行宏任务,打印d

9.执行延迟为100的宏任务,打印e f,执行微任务打印g,所有任务执行完毕

简单测试


console.log('start')

a().then(() => {
  console.log('a_then')
})

console.log('end')

function a() {
  console.log('a_function')
  return b().then((res) => {
    console.log('res', res)
    console.log('b_then')
    return Promise.resolve('a方法的返回值')
  })
}

function b() {
  console.log('b_function')
  return Promise.resolve('返回值')
}

结果:start a_function b_function end res 返回值 b_then a_then

根据上面例子的流程讲解来思考这个,加深理解

总结

  • JavaScript单线程,任务需要排队执行
  • 同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执
  • 行定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行
  • 以宏任务和微任务进一步理解js执行机制
  • 整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中
  • 整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续
  • 执行新的宏任务执行新的宏任务,凡是在执行宏任务过程中遇到微任务都将其推入微任务队列中执行
  • 反复如此直到所有任务全部执行完毕

以上就是用几道面试题来看JavaScript执行机制的详细内容,更多关于JavaScript执行机制的资料请关注编程网其它相关文章!

--结束END--

本文标题: 用几道面试题来看JavaScript执行机制

本文链接: https://lsjlt.com/news/125038.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 用几道面试题来看JavaScript执行机制
    目录前面的话同步和异步开胃菜加一盘宏任务 微任务来一盘Promise再加点定时器简单测试总结前面的话 根据JavaScript的运行环境,锁定它为单线程,任务需要排队执行,如果网站资...
    99+
    2024-04-02
  • 关于JavaScript执行机制的面试题
    小编给大家分享一下关于JavaScript执行机制的面试题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript的特点1.JavaScript主要用来向HTML页面添加交互行为。2.JavaScript可以直接...
    99+
    2023-06-14
  • 点开瞅瞅,再来几道Python面试题吧,
    本面试题题库,由公号:非本科程序员 整理发布 第1题:如何理解 Django 被称为 MTV 模式? 这个题就是面向对象设计和设计模式的开始。 你可能比较熟悉的模式叫做: MVC。说是 Model View Controller,而在 D...
    99+
    2023-01-31
    再来 几道 面试题
  • JavaScript必看的10道面试题总结(推荐)
    1.this指向 1.谁调用指向谁 例: function foo(){ console.log("this",this); } n...
    99+
    2024-04-02
  • 熟悉这几道 Redis 高频面试题,面试不用愁
    1、说说 Redis 都有哪些应用场景?缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。共享Session:对于一些依赖 session 功能...
    99+
    2023-06-02
  • 分享一道不错的TS面试题(含3层),看看能答到第几层!
    最近遇见一道不错的 TS 面试题,分享一下。这道题有 3 个层次,我们一层层来看。第一层的要求是这样的:实现一个 zip 函数,对两个数组的元素按顺序两两合并,比如输入 [1,2,3], [4,5,6] 时,返回 [[1,4], [2,5]...
    99+
    2023-05-14
    前端 JavaScript TypeScript
  • 如何从Javascript事件循环看出Vue.nextTick的原理和执行机制
    今天就跟大家聊聊有关如何从Javascript事件循环看出Vue.nextTick的原理和执行机制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。抛砖...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作