作用域与作用域链深度解析
一、作用域(Scope)
1、基本定义
作用域是程序中变量和函数的可访问范围,它规定了在何处以及如何查找变量。JavaScript采用词法作用域(Lexical Scope),即作用域在代码编写阶段就已确定(而非运行时)。
2、作用域的类型
2-1 全局作用域(Global Scope)
- 最外层作用域
- 在浏览器中是window对象
- 在Node.js中是global对象
- 生命周期:页面关闭时销毁
var globalVar = "I'm global"; // 全局变量function globalFunc() {console.log("Global function");
}// 浏览器环境中
console.log(window.globalVar); // "I'm global"
window.globalFunc(); // "Global function"
2-2 函数作用域(Function Scope)
- 函数内部的作用域
- 使用var声明的变量具有函数作用域
- 生命周期:函数执行完毕时销毁
function myFunction() {var functionScoped = "I'm function scoped";if (true) {var stillAccessible = "Still accessible";}console.log(stillAccessible); // "Still accessible"
}myFunction();
console.log(functionScoped); // ReferenceError: functionScoped is not defined
2-3 块级作用域(Block Scope)(ES6+)
- 由 {} 包围的代码块形成的作用域
- 使用let 和 const声明的变量具有块级作用域
- 生命周期:块执行完毕时销毁
{let blockScoped = "I'm block scoped";const alsoBlockScoped = "Me too!";
}console.log(blockScoped); // ReferenceError
console.log(alsoBlockScoped); // ReferenceErrorif (true) {let conditionVar = "Inside if block";console.log(conditionVar); // "Inside if block"
}
console.log(conditionVar); // ReferenceErrorfor (let i = 0; i &l