前端面试题每日3题——2022/08/30
1 以下代码执行后,控制台中的输出内容为?#
for (let i = 0; i < 3; i++) { setTimeout(() => { console.log(i); }); } for (var j = 0; j < 3; j++) { setTimeout(() => { console.log(j); }); }
2 以下代码执行后,控制台中的输出内容为?#
if (!("a" in window)) { var a = 1; } if (!("b" in window)) { let b = 1; } console.log(window); console.log(a); console.log(b);
3 以下代码执行后,控制台中的输出内容为?#
function fn() { var i = 0; return function () { console.log(i++); }; } var f1 = fn(); var f2 = fn(); f1(); f1(); f2();
1、答案:0 1 2 3 3 3#
解析:var 声明的变量没有块级作用域,在 for 循环中使用 var 声明迭代变量 j 会导致所有 setTimeout 中使用的 j 指向同一个变量,而 setTimeout 属于宏任务,执行的时机在正常任务队列之后,即此处 for 循环退出之后开始执行,此时迭代变量保存的是导致循环退出的值 3,因此所有 setTimeout 的回调函数都会输出 3
而 let 声明迭代变量时,JS 引擎会为每个迭代循环声明一个新的迭代变量,每个 setTimeout 引用的都是不同的变量实例,所以最后输出 0 1 2
2、答案:undefined 报错:Uncaught ReferenceError: b is not defined#
var 声明的变量没有块级作用域,并且存在变量提升,因此该题代码等价于:
var a; if (!("a" in window)) { a = 1; }
此时 a 为全局变量,而由 var 声明的全局变量会成为 window 的属性,因此 if 语句块中的代码不会执行,所以 console.log(a)
输出 undefined
而 let 声明的变量存在块级作用域的概念,所以 let b 不会成为全局变量,即使其成为全局变量,也不会成为 window 的属性,因为 let 声明的全局变量不会成为 window 的属性,所以在 console.log(b)
所在的作用域(全局)中,未声明变量 b,因此会报错:Uncaught ReferenceError: b is not defined
3、答案:0 1 0#
var 声明的变量不存在块级作用域,但是存在局部作用域,此题中变量 i 的作用域为 fn 函数作用域
每次调用fn
都会形成一个闭包,不同闭包之间是独立的不会互相干扰
闭包会将 i 的值保存下来,多次调用 fn() 返回的函数会修改 i 的值
所以最终会输出:0 1 0
公众号【今天也要写bug】
作者:程序员既明
出处:https://www.cnblogs.com/bidong/p/16643012.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
微信公众号:【今天也要写bug】获取更多优质内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!