# JavaScript 100 题交互自检

这不是一份只能向下翻的答案清单。下面完整保留 100 道 JavaScript 面试选择题,每一道都可以直接作答:选择选项后立即判断对错、自动展开解析,并把进度和错题保存在当前浏览器。

# 怎么练效果更好

  1. 先读代码并在心里说出执行过程,不要直接猜选项。
  2. 选择答案后对照解析,确认自己错在语法、运行环境还是执行顺序。
  3. 使用“错题”筛选集中重做,不需要从第 1 题重新翻。
  4. 全部完成后再清空进度做第二轮,比较正确率是否真正提升。

答题记录只写入当前浏览器的 localStorage,不会上传服务器。部分题目依赖经典浏览器脚本环境,解析中会保留原题语境;遇到 ES Module、严格模式或 Node.js 行为不同时,应以具体运行环境为准。

# 第 1 题:输出是什么?

function sayHi() {
  console.log(name)
  console.log(age)
  var name = 'Lydia'
  let age = 21
}

sayHi()
  • A. Lydiaundefined
  • B. LydiaReferenceError
  • C. ReferenceError21
  • D. undefinedReferenceError

正确答案:D

详细解析

在函数内部,我们首先通过 var 关键字声明了 name 变量。这意味着变量被提升了(内存空间在创建阶段就被设置好了),直到程序运行到定义变量位置之前默认值都是 undefined。因为当我们打印 name 变量时还没有执行到定义变量的位置,因此变量的值保持为 undefined

通过 letconst 关键字声明的变量也会提升,但是和 var 不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。当我们试图在声明之前访问它们时,JavaScript 将会抛出一个 ReferenceError 错误。


# 第 2 题:输出是什么?

for (var i = 0; i  console.log(i), 1)
}

for (let i = 0; i  console.log(i), 1)
}
  • A. 0 1 20 1 2
  • B. 0 1 23 3 3
  • C. 3 3 30 1 2

正确答案:C

详细解析

由于 JavaScript 的事件循环,setTimeout 回调会在遍历结束后才执行。因为在第一个遍历中遍历 i 是通过 var 关键字声明的,所以这个值是全局作用域下的。在遍历过程中,我们通过一元操作符 ++ 来每次递增 i 的值。当 setTimeout 回调执行的时候,i 的值等于 3。

在第二个遍历中,遍历 i 是通过 let 关键字声明的:通过 letconst 关键字声明的变量是拥有块级作用域(指的是任何在 {} 中的内容)。在每次的遍历过程中,i 都有一个新值,并且每个值都在循环内的作用域中。

webapp
公众号
开发者导航
切换夜间模式
点击侧边栏下一篇
折叠侧边栏
收起全部