2026前端面试题(三)

2026前端面试题(三)

块级作用域

由 {} 包裹的代码块(如 if、for、while)形成的作用域。

if (true) { let blockVar = '块级变量'; const PI = 3.14; console.log(blockVar); // ✅ 可以访问 } console.log(blockVar); // ❌ ReferenceError

var 没有块级作用域,它只认函数作用域和全局作用域。

// var 的坑:没有块级作用域 for (var i = 0; i < 3; i++) {} console.log(i); // 3(循环结束后 i 依然可见) // let 修复了这个行为 for (let j = 0; j < 3; j++) {} console.log(j); // ReferenceError

作用域链

当访问一个变量时,JavaScript 引擎会从内到外逐层查找

逐级向上找变量,是书写代码的地方逐级向上,而不是调用的地方逐级向上

var value = '全局'; function foo() { console.log(value); // 词法作用域:永远找定义时的外层 } function bar() { var value = '局部'; foo(); // 调用 foo,但 foo 里的 value 仍然是 '全局' } bar(); // 输出:"全局"

变量提升

console.log(x); // undefined(不是报错,因为声明提升了) var x = 10; // 等价于: var x; console.log(x); // undefined x = 10;

let 和 const 虽然也有提升,但会进入暂时性死区(Temporal Dead Zone, TDZ),在声明前访问会报错

console.log(y); // ❌ ReferenceError: Cannot access 'y' before initialization let y = 20;

函数声明的提升优先级高于变量声明

console.log(foo); // [Function: foo] function foo() {} var foo = '变量';
console.log(foo); // [Function: foo] var foo = '变量'; function foo() {}

上面两种情况的输出结果一样