作用域、作用域链

1. 作用域(Scope)

作用域定义了变量和函数的可访问范围。作用域是在函数定义时确定的。JavaScript中的作用域主要分为以下几种:

  • 全局作用域:在脚本文件或最外层定义的变量属于全局作用域。全局作用域中的变量可以在代码的任何地方访问。
  • 函数作用域:在函数内定义的变量在函数作用域中是局部的,只能在该函数内部访问,函数外无法访问这些变量。
  • 块级作用域:使用letconst声明的变量在块级作用域({}内部)中有效。块级作用域仅在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时,内层的作用域都没有找到,最终在全局作用域找到了。
posted @   我是格鲁特  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示