作用域、作用域链
1. 作用域(Scope)
作用域定义了变量和函数的可访问范围。作用域是在函数定义时确定的。JavaScript中的作用域主要分为以下几种:
- 全局作用域:在脚本文件或最外层定义的变量属于全局作用域。全局作用域中的变量可以在代码的任何地方访问。
- 函数作用域:在函数内定义的变量在函数作用域中是局部的,只能在该函数内部访问,函数外无法访问这些变量。
- 块级作用域:使用
let
或const
声明的变量在块级作用域({}
内部)中有效。块级作用域仅在ES6
引入,var
声明的变量没有块级作用域的特性。
1 2 3 4 5 6 7 8 9 10 11 12 | var globalVar = "global" ; // 全局作用域 function foo() { var localVar = "local" ; // 函数作用域 console.log(globalVar); // 可以访问全局变量 console.log(localVar); // 可以访问局部变量 } foo(); console.log(globalVar); // 可以访问全局变量 console.log(localVar); // 报错,无法访问函数内的局部变量 |
2. 作用域链(Scope Chain)
作用域链是在当前作用域无法找到某个变量时,向外层作用域逐层查找变量的过程,直到找到该变量或到达最外层的全局作用域。如果在全局作用域也未找到,则返回undefined
或抛出ReferenceError
错误。
作用域链从内向外查找,即从当前作用域向全局作用域逐层查找,形成了一个链式结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var globalVar = "global" ; function outerFunction() { var outerVar = "outer" ; function innerFunction() { var innerVar = "inner" ; console.log(innerVar); // "inner" - 在当前作用域找到 console.log(outerVar); // "outer" - 在外层作用域找到 console.log(globalVar); // "global" - 在全局作用域找到 } innerFunction(); } outerFunction(); |
在innerFunction
中:
- 查找
innerVar
时,找到它在当前作用域的定义。 - 查找
outerVar
时,当前作用域没有定义,于是向上一级作用域(outerFunction
)查找,找到了。 - 查找
globalVar
时,内层的作用域都没有找到,最终在全局作用域找到了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现