javascript 中查找变量依靠作用域链,从当前执行上下文开始,由内向外逐层向上搜索,直到全局作用域;若未找到则抛出 referenceerror。具体做法是引擎在创建执行上下文时构建该上下文的作用域链,包含当前函数、外层函数直至全局对象的所有变量环境。

let 和 var 在循环中的作用域差异是什么
在循环中使用 let 会为每次迭代创建独立块级作用域,而 var 仅有一个函数或全局作用域,导致闭包捕获的是同一个变量引用。使用 let 可确保每个定时器回调访问到对应迭代的值,使用 var 则所有回调都指向循环结束后的最终值。

function testLet() {
for (let i = 0; i console.log(i), 10);
}
}
function testVar() {
for (var j = 0; j console.log(j), 10);
}
}
testLet(); // 输出: 0, 1, 2
testVar(); // 输出: 3, 3, 3
箭头函数如何影响 this 和作用域链查找
箭头函数不创建自己的 this 绑定,而是词法继承外层作用域的 this 值。这意味着在箭头函数内部查找 this 时,不会像普通函数那样动态绑定调用者,而是直接沿作用域链向上查找最近的外层非箭头函数的 this。这种机制使得箭头函数在处理回调时能更稳定地保持预期的上下文。

const obj = {
name: 'Object',
regular: function() {
return this.name;
},
arrow: () => {
return this.name;
}
};
console.log(obj.regular()); // 'Object'
console.log(obj.arrow()); // undefined (window.name in browser)
块级作用域中变量提升对条件判断的影响
在块级作用域中,let 和 const 声明的变量存在暂时性死区(TDZ),在声明前访问会抛出错误,而 var 声明的变量会被提升到块顶部并初始化为 undefined。这导致在条件判断中,如果使用 var 可能意外访问到提升后的未定义值,而使用 let 则会因 TDZ 报错,从而强制开发者明确变量初始化顺序。
if (true) {
console.log(a); // ReferenceError (TDZ)
let a = 10;
}
if (true) {
console.log(b); // undefined
var b = 10;
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











