JavaScript 基础核心知识点闯关练习(2025–2026 版)
这份闯关题覆盖了 JavaScript 最核心、最常被考察的基础部分:
变量声明 & 作用域、Hoisting、闭包、this、类型转换、原型链、函数性质、异步基础(Promise & async/await)等。
共 8 关,每关 3–5 题,难度递增。
每题后我会先放选项,你可以在心里选答案(或写下来),然后往下拉看解析 + 正确答案。
准备好了吗?开始!
第1关:变量声明 & 作用域(var / let / const)
1-1
console.log(a);
var a = 1;
输出是什么?
A. undefined
B. 1
C. ReferenceError
1-2
let x = 10;
if (true) {
let x = 20;
console.log(x);
}
console.log(x);
输出?
A. 20 10
B. 10 10
C. 20 20
D. ReferenceError
1-3
const obj = { name: "Alice" };
obj.name = "Bob";
console.log(obj.name);
obj = { name: "Charlie" }; // 这行会怎样?
A. Bob (第二行抛 TypeError)
B. Bob (第二行正常,但 obj 变成 Charlie)
C. TypeError 从第一行开始
1-4(经典坑)
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
输出?
A. 0 1 2
B. 3 3 3
C. 0 0 0
第2关:Hoisting(提升)
2-1
foo();
function foo() {
console.log("foo");
}
输出?
A. foo
B. ReferenceError
C. undefined
2-2
console.log(x);
var x = 5;
function x() {}
console.log(x);
输出?
A. undefined 5
B. function x(){} 5
C. 5 5
D. TypeError
2-3
console.log(a);
let a = 10;
输出?
A. undefined
B. 10
C. ReferenceError(TDZ)
第3关:闭包(Closure)经典题
3-1
function createCounter() {
let count = 0;
return function() {
return ++count;
};
}
const counter1 = createCounter();
const counter2 = createCounter();
console.log(counter1()); // ?
console.log(counter1()); // ?
console.log(counter2()); // ?
输出?
A. 1 2 1
B. 1 2 3
C. 1 1 1
3-2(for 循环闭包经典)
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
输出?
A. 0 1 2
B. 3 3 3
C. 1 2 3
第4关:this 指向(最爱考)
4-1
const obj = {
name: "Obj",
say: function() {
console.log(this.name);
}
};
const say = obj.say;
say(); // ?
obj.say(); // ?
A. undefined Obj
B. Obj Obj
C. undefined undefined
4-2
function Person(name) {
this.name = name;
}
const p = new Person("Alice");
console.log(p.name); // ?
const p2 = Person("Bob");
console.log(name); // ?
A. Alice Bob
B. Alice undefined
C. Alice ReferenceError(严格模式)
4-3(箭头函数)
const obj = {
name: "Obj",
say: () => console.log(this.name),
say2() { console.log(this.name); }
};
obj.say(); // ?
obj.say2(); // ?
A. undefined Obj
B. Obj Obj
C. undefined undefined
第5关:类型 & 隐式转换
5-1
console.log([] + {}); // ?
console.log({} + []); // ?
console.log([] + {} === {} + []); // ?
5-2
console.log(1 + "2" + "2");
console.log(1 + +"2" + "2");
console.log("1" - "1" + "2");
第6关:原型 & 继承基础
6-1
function Animal() {}
Animal.prototype.sound = "???";
const dog = new Animal();
console.log(dog.sound); // ?
dog.sound = "Woof";
console.log(dog.sound); // ?
console.log(Animal.prototype.sound); // ?
6-2
console.log({}.__proto__ === Object.prototype); // ?
console.log([].__proto__ === Array.prototype); // ?
console.log(function(){}.__proto__ === Function.prototype); // ?
第7关:Promise & async/await 基础
7-1
Promise.resolve(1)
.then(x => x + 1)
.then(x => { throw new Error("Error") })
.catch(x => x.message)
.then(x => console.log(x));
输出?
A. Error
B. undefined
C. 2
7-2
async function test() {
console.log(1);
await Promise.resolve();
console.log(2);
}
console.log(0);
test();
console.log(3);
输出顺序?
A. 0 1 3 2
B. 0 1 2 3
C. 1 0 3 2
第8关:综合小题(实战级)
8-1
写出下面代码的输出(考察 this + 闭包 + 异步):
const obj = {
value: 42,
getValue: function() {
return this.value;
}
};
const fn = obj.getValue;
console.log(fn());
setTimeout(() => console.log(obj.getValue()), 0);
8-2
let a = 10;
function outer() {
let a = 20;
function inner() {
console.log(a);
}
a = 30;
return inner;
}
outer()();
答案 & 解析区(先别往下拉!自己做完再看)
点击展开全部答案 + 详细解析
1关
1-1: A (var 声明提升,初始化留在原位)
1-2: A (let 块级作用域)
1-3: A (const 保护的是引用,对象属性可改)
1-4: B (var 函数作用域 + 闭包经典坑)
2关
2-1: A (函数声明整体提升)
2-2: A (var 提升,函数提升覆盖 var,但赋值后变 number)
2-3: C (let 有 TDZ)
3关
3-1: A (每个 counter 有独立闭包)
3-2: A (let 块级 + 每次循环新变量)
4关
4-1: A (普通调用 this → window/global)
4-2: A (new 绑定 this;非严格模式下 this → window)
4-3: A (箭头函数 this 继承外层)
5关
5-1: [object Object] [object Object] false
5-2: “122” “32” “02”
6关
6-1: ??? Woof ??? (原型未变)
6-2: true true true
7关
7-1: A (catch 捕获后 then 拿到 Error 对象.message)
7-2: A (0 1 3 → 微任务 2)
8关
8-1: undefined 42
8-2: 30 (inner 闭包捕获 outer 的 a,最后赋值为 30)
做对多少关?
8/8 → 基础很扎实,继续刷中高级题
5–7 → 不错,但有几处经典坑要补
<5 → 建议重新系统复习「你不知道的 JavaScript」上卷
想继续?
A. 下一轮:中级题(事件循环、微任务、Generator、Proxy 等)
B. 重做本轮(我随机打乱顺序出新题)
C. 针对某关弱项专项练习(比如只刷 this / 闭包 / Promise)
D. 直接来 10 道综合代码预测题(带 console 输出)
告诉我字母(或关数),我们继续闯!