当前位置: 首页 > Web前端 > JavaScript

前端面试题每天3题——2022-08-30

时间:2023-03-26 23:33:56 JavaScript

1下面代码执行后,控制台输出什么?for(leti=0;i<3;i++){setTimeout(()=>{console.log(i);});}for(varj=0;j<3;j++){setTimeout(()=>{console.log(j);});}2下面代码执行后,控制台输出什么?if(!("a"inwindow)){vara=1;}if(!("b"inwindow)){letb=1;}console.log(window);console.log(a);console.log(b);3下面代码执行后,控制台输出什么?函数fn(){变量i=0;返回函数(){console.log(i++);};}varf1=fn();varf2=fn();f1();f1();f2();1.答案:012333分析:var声明的变量没有块级作用域。在for循环中使用var声明迭代变量j会导致所有setTimeout中使用的j都指向同一个变量,而setTimeout属于宏Task,执行时机在正常任务队列之后,即在for循环在这里退出,开始执行。此时迭代变量保存的是导致循环退出的值3,所以所有的setTimeout回调函数都会输出3。当let声明迭代变量时,JS引擎会为每一次迭代循环声明一个新的迭代变量,并且每一次setTimeout引用了不同的变量实例,所以最终输出为0122。答:undefinedError:UncaughtReferenceError:bisnotdefinedvardeclaredvariable没有块级作用域,有变量提升,所以这段代码问题等同于:vara;if(!("a"inwindow)){a=1;}此时a是一个全局变量,通过var声明的window的全局变量将成为窗口的属性,所以if语句块中的代码不会被执行,所以console.log(a)输出undefined,let声明的变量有块级作用域的概念,所以letb不会成为全局变量,即使成为全局变量也不会成为window的属性,因为let声明的全局变量不会成为window的属性,所以在console.log(b)所在的作用域(全局)内,并没有声明变量b,所以会报错:UncaughtReferenceError:b未定义3。答案:010var声明的变量未定义有块级作用域,但有局部作用域。本题变量i的作用域为fn。每次在函数范围内调用fn时,都会形成一个闭包。不同的闭包是独立的,不会互相干扰。闭包会保存i的值,多次调用fn()返回的函数会修改i的值,所以最终输出会是:010公众号【我今天也来写个bug】