送你 43 道 JS 面试题(站在巨人的肩膀上)
送你 43 道 JS 面试题
1、下面代码的输出是什么?
12345678function sayHi() {
console.log(name);
console.log(age);
var name = "Lydia";
let age = 21;
}
sayHi();
A:
Lydia
和undefined
B:
Lydia
和ReferenceError
C:
ReferenceError
和21
D:
undefined
和ReferenceError
答案:D
- 在函数中,我们首先使用
var
关键字声明了name
变量。 这意味着变量在创建阶段会被提升(JavaScript
会在创建变量创建阶段为其分配内存空间),默认值为undefined
,直到我们实际执行到使用该变量的行。 我们还没有为name
变量赋值,所以它仍然保持undefined
的值。实际变量提升的代码执行顺序
function sayHi() { var name console.log(name); name = "Lydia"; } sayHi();
- 使用
let
关键字(和const
)声明的变量也会存在变量提升,但与var
不同,初始化没有被提升。 在我们声明(初始化)它们之前,它们是不可访问的。 这被称为“暂时死区”。 当我们在声明变量之前尝试访问变量时,JavaScript
会抛出一个ReferenceError
。关于
let
的是否存在变量提升,我们何以用下面的例子来验证:let name = 'ConardLi' { console.log(name) // Uncaught ReferenceError: name is not defined let name = 'code秘密花园' }
let
变量如果不存在变量提升,console.log(name)
就会输出ConardLi
,结果却抛出了ReferenceError
,那么这很好的说明了,let
也存在变量提升,但是它存在一个“暂时死区”,在变量未初始化或赋值前不允许访问。
- 变量的赋值可以分为三个阶段:
- 创建变量,在内存中开辟空间
- 初始化变量,将变量初始化为
undefined
- 真正赋值
- 关于
let
、var
和function
:
let
的「创建」过程被提升了,但是初始化没有提升。
var
的「创建」和「初始化」都被提升了。
function
的「创建」「初始化」和「赋值」都被提升了。
2. 下面代码的输出是什么?
1234567for (var i = 0; i <
3
; i++) {
setTimeout(() => console.log(i), 1);
}
for (let i = 0; i <
3
; i++) {
setTimeout(() => console.log(i), 1);
}
A:
0 1 2
and0 1 2
B:
0 1 2
and3 3 3
C:
3 3 3
and0 1 2
答案:C
- 由于
JavaScript
中的事件执行机制,setTimeout
函数真正被执行时,循环已经走完。 由于第一个循环中的变量i
是使用var
关键字声明的,因此该值是全局的。 在循环期间,我们每次使用一元运算符++
都会将i
的值增加1
。 因此在第一个例子中,当调用setTimeout
函数时,i
已经被赋值为3
。- 在第二个循环中,使用
let
关键字声明变量i
:使用let
(和const
)关键字声明的变量是具有块作用域的(块是{}
之间的任何东西)。 在每次迭代期间,i
将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗