2026前端面试题(三)
块级作用域
由 {} 包裹的代码块(如 if、for、while)形成的作用域。
if (true) { let blockVar = '块级变量'; const PI = 3.14; console.log(blockVar); // ✅ 可以访问 } console.log(blockVar); // ❌ ReferenceErrorvar 没有块级作用域,它只认函数作用域和全局作用域。
// 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() {}上面两种情况的输出结果一样
