JS预解析(变量提升、函数提升)面试题及详细答案_第1页
JS预解析(变量提升、函数提升)面试题及详细答案_第2页
JS预解析(变量提升、函数提升)面试题及详细答案_第3页
JS预解析(变量提升、函数提升)面试题及详细答案_第4页
JS预解析(变量提升、函数提升)面试题及详细答案_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JS预解析(变量提升、函数提升)面试题及详细答案面试说明:本套试题聚焦JS核心底层预解析机制,涵盖变量提升、函数提升、作用域、暂时性死区、变量与函数优先级等高频面试考点,题型包含选择题、判断题、代码阅读分析题、简答题,所有题目均贴合企业真实面试场景,答案侧重原理拆解与实战解析。一、单项选择题(共10题,每题4分,共40分)1、JavaScript代码的执行顺序是()A、逐行解析、逐行执行,无预处理阶段B、先全局预解析所有声明,再逐行执行代码C、先执行代码,再解析变量声明D、仅函数会预解析,变量无预解析过程2、以下关于var声明变量的提升规则,说法正确的是()A、变量声明和赋值都会提升B、仅变量声明提升,赋值不提升C、var变量无提升特性D、赋值优先于声明提升3、在同一作用域中,函数提升和var变量提升的优先级关系是()A、var变量提升优先级更高B、函数提升优先级更高C、两者优先级一致,按代码顺序提升D、随机优先级4、let、const声明的变量存在暂时性死区,核心原因是()A、变量没有被提升B、变量已提升,但未初始化,不能访问C、浏览器刻意限制访问D、块级作用域不支持变量提升5、下列哪种声明方式可以在声明前直接调用且不报错()A、var函数变量声明B、let函数变量声明C、函数声明式定义函数D、const函数变量声明6、预解析阶段,不会被提升的是()A、var变量声明B、function函数声明C、let、const变量声明D、以上都不对7、关于全局作用域中变量提升,以下说法错误的是()A、var声明的全局变量会挂载到window对象B、函数声明会提升到全局作用域顶部C、let全局变量会挂载到window对象D、变量提升只针对当前作用域生效8、函数内部的预解析范围是()A、全局作用域所有变量B、当前函数局部作用域内所有声明的变量和函数C、仅函数参数变量D、仅函数内部的函数声明9、以下代码执行结果为()console.log(a);vara=10;A、10B、undefinedC、报错D、null10、以下代码执行结果为()console.log(b);letb=20;A、20B、undefinedC、报错D、null二、判断题(共8题,每题3分,共24分,对的打√,错的打×)1、JS预解析只会在全局作用域触发,函数局部作用域没有预解析机制。()2、函数表达式不存在提升特性,只有函数声明存在提升。()3、var声明的变量可以重复声明,后续声明不会生效,不会报错。()4、暂时性死区的结束位置是变量声明代码执行完成的时刻。()5、提升的本质是代码执行前,JS引擎提前扫描并注册所有声明标识。()6、const声明的变量有提升,不存在暂时性死区。()7、同一变量,函数声明会覆盖var变量的提升结果。()8、代码执行阶段,赋值操作会覆盖预解析的默认undefined值。()三、代码阅读分析题(共3题,每题8分,共24分)题目1:写出代码执行结果并解释原因console.log(num);varnum=100;functionnum(){}console.log(num);题目2:写出代码执行结果并解释原因fn();varfn=function(){console.log(1);}functionfn(){console.log(2);}题目3:写出代码执行结果并解释原因console.log(x);letx=5;console.log(x);四、简答题(共2题,每题6分,共12分)1、简述JS预解析的执行流程。2、详细说明var、let、const三者在变量提升、暂时性死区、重复声明上的区别。参考答案及详细解析一、单项选择题答案及解析1、B解析:JS代码执行分为两个阶段,第一步是预解析阶段,引擎会扫描当前作用域,提前提升所有变量、函数声明;第二步是逐行执行代码,并非边解析边执行。2、B解析:var变量的提升规则为只提升声明,不提升赋值。预解析时仅注册变量名,默认赋值为undefined,真正的赋值操作会留在代码执行阶段执行。3、B解析:同一作用域内,函数声明提升优先级高于var变量。若变量名和函数名重复,预解析时函数声明会覆盖变量声明的undefined初始值。4、B解析:let、const是存在提升的,区别于var的是,二者提升后不会初始化默认值,在声明前访问变量会触发暂时性死区,直接报错。5、C解析:只有纯函数声明式定义的函数会完整提升,可在声明前调用;函数表达式依托变量声明,var、let、const定义的函数变量均无法提前调用。6、C解析:let、const声明会提升,但未初始化,存在暂时性死区;日常面试口语中常说“不提升”,实际底层是提升未初始化,严格语义下本题选C。7、C解析:只有var声明的全局变量会挂载到window,let、const声明的全局变量属于全局作用域,但不会挂载到window对象。8、B解析:每个函数独立拥有局部作用域,函数执行前,会单独对当前局部作用域内的所有变量、函数做预解析,互不干扰。9、B解析:vara声明提升,默认初始值为undefined,代码执行到打印语句时,赋值操作尚未执行,因此打印undefined。10、C解析:letb提升但未初始化,处于暂时性死区,声明前访问变量会抛出Cannotaccess'b'beforeinitialization报错。二、判断题答案及解析1、×解析:预解析是每个作用域独立触发,全局作用域、函数局部作用域、块级作用域均有预解析机制。2、√解析:函数表达式本质是变量赋值,变量可以提升,但赋值不会提升,因此无法提前调用,只有函数声明具备完整提升特性。3、√解析:var支持重复声明,重复声明的变量不会重新赋值,也不会报错,仅首次声明会生效。4、√解析:暂时性死区从作用域开头开始,到变量声明代码执行结束终止,声明后即可正常访问变量。5、√解析:预解析、提升的底层本质,就是JS引擎在代码执行前,提前扫描、登记所有声明标识符,分配内存空间。6、×解析:const和let规则一致,存在提升,且存在暂时性死区,唯一区别是const声明后不可修改赋值。7、√解析:函数提升优先级高于var变量,同名情况下,函数声明会覆盖变量的初始undefined值。8、√解析:预解析阶段变量默认值为undefined,代码执行阶段的赋值操作,会覆盖初始默认值,完成变量赋值。三、代码阅读分析题答案及解析题目1答案:最先打印[Function:num],最后打印100解析:1、预解析阶段:同作用域同名,函数提升优先级更高,num先被提升为函数;2、第一行打印时,num是提升后的函数,因此打印函数本身;3、代码执行到varnum=100,赋值操作覆盖函数;4、最后打印num,输出赋值后的100。题目2答案:打印2解析:1、预解析阶段:先提升varfn(值为undefined),再提升functionfn,覆盖变量,fn为函数;2、执行fn(),调用函数声明,打印2;3、后续函数表达式赋值,仅修改后续fn的值,不影响本次调用结果。题目3答案:直接报错,无法执行后续代码解析:let变量存在暂时性死区,预解析提升但未初始化,第一行打印x属于死区访问,直接抛出初始化报错,代码终止执行,后续代码不会运行。四、简答题参考答案1、简述JS预解析的执行流程JS代码执行严格分为两个阶段,预解析阶段优先于代码执行阶段:第一阶段:预解析(提升)。JS引擎从作用域顶部开始扫描,识别当前作用域内所有变量声明、函数声明,将其提前到作用域顶部注册。var变量初始化为undefined,function函数直接完整初始化可调用,let/const变量提升但不初始化,进入暂时性死区。此阶段只处理声明,不处理赋值、逻辑运算、函数调用。第二阶段:逐行执行。按照代码书写顺序,逐行执行赋值、打印、函数调用、逻辑代码,覆盖预解析的初始值,完成完整代码逻辑。2、var、let、const三者核心区别(提升、死区、重复声明)1、变量提升:var存在完整提升,提升后默认赋值undefined;let、const存在提升但不初始化,无默认值。2、暂时性死区

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论