给大家分享一篇面试相关的文章。希望2022年你钓鱼的时间越来越多,工资涨得越来越快!1.事件循环机制阿里面试题1://运行结果41352//如果你已经了解事件运行机制,可以跳过这道题。事件循环机制,event-loop。包含三部分:调用栈、消息队列、微任务队列。当事件循环开始时,代码将在全局范围内逐行执行。当遇到函数调用时,它会被压入调用栈。当函数执行完成时,调用堆栈将被弹出。//例如:代码会逐行执行,调用完所有函数后会清空调用栈functionf1(){console.log(1)}functionf2(){f1()console.log(2)}f2()//执行结果12如果是fetch,setInterval,setTimeout异步操作,当函数调用被压入调用栈时,异步执行的内容会被加入到消息队列中,消息队列中的内容在清除调用堆栈之前不会执行。//如:functionf1(){console.log(1)}functionf2(){setTimeout(()=>{console.log(2)},0)f1()console.log(3)}f2()//执行结果:当132遇到promise、async、await异步操作时,会将执行内容加入到microtask队列中,清空调用栈后立即执行。添加到调用堆栈的微任务队列会立即执行。比如letp=newPromise(resolve=>{console.log('立即执行')resolve(1)//在thencall中执行})microtask队列中的内容先执行,所以比内容先执行在消息队列中。了解了这些知识后,再试试第一道面试题,应该没有问题。2.你对范围了解多少?阿里面试题2://运行结果:/*functiona(){}12functionc(){}undefinedundefinedfunction(){}functionc(){}*/Scope通俗地说,就是指一个变量的作用域。下面分别介绍全局作用域和函数作用域的概念。全局范围在页面打开时创建,在页面关闭时销毁。script标签下编写的变量和函数具有全局作用域,可以在页面的任何位置访问。有一个全局对象窗口,代表浏览器窗口。全局角色下的变量和函数作为窗口(局部)函数的属性和方法函数作用域,调用时创建,执行后销毁。每次调用函数时,都会重新创建变量和函数,它们是相互独立的。函数作用域内可以访问全局变量或函数,但函数作用域内的变量不能在函数外访问。会在自己的范围内查找,如果不在上层范围内查找,直到全局范围内查找。说完这些概念,我发现上面的面试题我还是不会做。接下来,我将了解学习范围的预编译,看看函数执行时做了什么。调用函数时,会先进行预编译。:globalscopeprecompilation:创建上下文GO对象。找到一个变量声明,使用变量名作为GO对象的属性名,值为undefinedAO对象的属性,赋值对于未定义的实参和形参的统一,在函数体中找到函数声明,给函数体赋值。了解了预编译过程之后,我们分析上面的面试题,分析一下运行结果是怎么来的。调用fn函数时,先进行预编译。第一阶段:生成AO对象。第二阶段:找到形参和实参,作为AO对象的属性名,值为udefined。AO{a:undefined,b:undefined,c:undefined,d:undefined}第三阶段:实参和形参统一,之后AO对象变为:AO{a:1,b:undefined,c:2,d:undefined}第四阶段:找到函数声明,给变量赋值,AO改为:AO{a:functiona(){},b:undefined,c:functionc(){},d:undefined}This结合函数的预编译过程和函数作用域的概念,再次尝试面试题。简单吗?3、为什么会有闭包?它解决了什么问题?示例3:varliArr=document.getElementsByTagName('li')for(vari=0;i
