首页IT科技js运行机制面试(JS执行机制及ES6)

js运行机制面试(JS执行机制及ES6)

时间2025-09-19 18:33:02分类IT科技浏览5213
导读:一、JS执行机制 JS语言有个特点是单线程,即同一时间只能做一件事。单线程就意味着,所有的任务需要排队,前一个任务结束,才会执行后一个任务,可能造成页面渲染不连贯。...

一                 、JS执行机制

JS语言有个特点是单线程                 ,即同一时间只能做一件事                。单线程就意味着                        ,所有的任务需要排队        ,前一个任务结束             ,才会执行后一个任务                        ,可能造成页面渲染不连贯                         。

为了解决这个问题            ,利用多核CPU的计算能力         ,允许JS脚本创建多个线程                         ,即同步异步        。

同步任务:

同步任务都在主线程上执行                ,形成一个执行栈            。 前一个任务结束后再去执行下一个任务    ,程序的执行顺序与任务的排列顺序是一致的同步的                         。 比如做饭的同步做法                         ,我们要烧水煮饭                    ,等水开了,再去切菜                     ,炒菜            。

异步任务:

通过回调函数实现的                        ,异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)        。

在做一件事的同时    ,还可以去处理其他的事情                         。

比如做饭的异步做法                 ,在烧水的同时                        ,利用这段时间        ,去切菜             ,炒菜                 。

异步任务分类: 1.普通事件                        ,如click                        、resize等    。 2.资源加载            ,如load        、error等                        。 3.定时器         ,包括setTimeout             、setInterval等                     。

同步和异步本质的区别:在这条"流水线"上各个流程的执行顺序不同。

JS执行机制步骤:

由于主线程不断地重复获得任务                        、执行任务            、再获取任务         、再执行                         ,所以这种机制被称为事件循环                ,即event loop                    。

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

然后异步任务(回调函数)放任务队列中    。

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

二                         、ES6概述 新增了变量的声明方式                、解构赋值    、模板字符串                         、简化对象写法                    、箭头函数、函数形参默认值                     、rest参数                        、拓展运算符    、新增数据类型(Set                 、Map                        、Symbol        、BigInt)             、promise                        、async/await等                         。 三            、var         、let                         、const的区别 区别 var let const 是否有块级作用域 ❌ ✔ ✔ 是否存在变量提升 ✔ ❌ ❌ 是否添加全局属性 ✔ ❌ ❌ 能否重复声明变量 ✔ ❌ ❌ 是否存在暂时性死区 ❌ ✔ ✔ 是否必须设置初始值 ❌ ❌ ✔ 能否改变指针指向 ✔ ✔ ❌ 四                、箭头函数与普通函数的区别 箭头函数比普通函数更加简洁 如果只有一个参数                     ,可以省去参数的括号        。 如果函数体的返回值只有一句                        ,可以省略大括号    ,且必须省略return            。 箭头函数没有自己的this 箭头函数不会创建自己的this                 , 所以它没有自己的this                        ,它只会在自己作用域的上一层继承this                         。所以箭头函数中this的指向在它在定义时已经确定了        ,之后不会改变            。 call()    、apply()                         、bind()等方法不能改变箭头函数中this的指向 箭头函数的this指向要么是window             ,要么是它的外层        。 箭头函数不能作为构造函数使用 箭头函数是ES6中的提出来的                        ,它没有prototype            ,也没有自己的this指向         ,更不可以使用arguments参数                         ,所以不能New一个箭头函数;new操作符的实现步骤如下: 1.创建一个对象 2.将构造函数的作用域赋给新对象(也就是将对象的proto属性指向构造函数的prototype属性) 3.指向构造函数中的代码                ,构造函数中的this指向该对象(也就是为这个对象添加属性和方法) 4.返回新的对象    ,所以                         ,上面的第二                    、三步                    ,箭头函数都是没有办法执行的 箭头函数没有自己的arguments 箭头函数没有自己的arguments对象                         。在箭头函数中访问arguments实际上获得的是它外层函数的arguments值                 。 箭头函数没有prototype 箭头函数不能用作Generator函数,不能使用yield关键字 五、箭头函数的this指向 箭头函数不同于传统JavaScript中的函数                     ,箭头函数并没有属于⾃⼰的this                        ,它所谓的this是捕获其所在上下⽂的 this 值    ,作为⾃⼰的 this 值                 ,并且由于没有属于⾃⼰的this                        ,所以是不会被new调⽤的        ,这个所谓的this也不会被改变    。箭头函数的this指向外层函数的this                        。 六                     、扩展运算符的作用及使用场景 对象扩展运算符 对象的扩展运算符(...)用于取出参数对象中的所有可遍历属性             ,拷贝到当前对象之中                     。扩展运算符对对象实例的拷贝属于浅拷贝。 数组扩展运算符 数组的扩展运算符可以将一个数组转为用逗号分隔的参数序列                        ,且每次只能展开一层数组                    。 七                        、对象与数组的解构 解构是 ES6 提供的一种新的提取数据的模式            ,这种模式能够从对象或数组里有针对性地拿到想要的数值                         。 对象的解构 在解构对象时         ,是以属性的名称为匹配条件                         ,来提取想要的数据的    。 数组的解构 在解构数组时                ,以元素的位置为匹配条件来提取想要的数据的                。 八    、模板语法 允许用${}的方式嵌入变量    ,优势有两个: 在模板字符串中                         ,空格                 、缩进                        、换行都会被保留                    ,可以识别html代码                         。 模板字符串完全支持“运算                ”式的表达式,可以在${}里完成一些计算        。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
Uniapp使用阿里云播放器(记录–uniapp 使用原生子窗体进行视频聊天)