const globalVar = "I'm global";
function showGlobal() {
console.log(globalVar); // 可访问
}
showGlobal();
function myFunction() {
const localVar = "I'm local";
console.log(localVar); // 可访问
}
console.log(localVar); // 报错:localVar未定义
if (true) {
const blockVar = "I'm block-scoped";
console.log(blockVar); // 可访问
}
console.log(blockVar); // 报错:blockVar未定义
当前作用域:先在当前函数或块中查找变量。 外层作用域:如果未找到,逐层向外层作用域(父函数或全局)查找。 全局作用域:如果仍未找到,在全局作用域中查找;若不存在则报错。
每个函数在创建时会记录其所在的作用域链。 嵌套函数会继承外层函数的作用域链。
const globalVar = "Global";
function outer() {
const outerVar = "Outer";
function inner() {
const innerVar = "Inner";
console.log(innerVar); // Inner(当前作用域)
console.log(outerVar); // Outer(外层作用域)
console.log(globalVar); // Global(全局作用域)
}
inner();
}
outer();
闭包是函数与其作用域链的结合。即使外层函数执行完毕,内层函数仍能访问外层函数的变量:
function createCounter() {
let count = 0;
return function() {
count++;
console.log(count);
};
}
const counter = createCounter();
counter(); // 1
counter(); // 2 (count变量通过闭包保留)
作用域污染(Scope Pollution)是指在代码中无意或过度地将变量、函数或其他标识符暴露到全局作用域或更高层级的作用域中,导致命名冲突、意外的变量覆盖或难以维护的代码。
var a = 1; // 全局变量
function foo() {
b = 2; // 未声明变量,自动成为全局变量
}
console.log(x); // undefined(变量提升)
var x = 10;