作用域和作用域链

78 阅读2分钟

前言

在JavaScript中,作用域(Scope)是变量与函数的可访问性的规则,决定了代码块中变量和函数的可见性和生命周期。

作用域链是函数内部可以访问的变量和函数的集合。

一、作用域

W3Cschool这样描述作用域

作用域是可访问变量的集合。
在JS中,能够定义 全局作用域 和 局部作用域。
在JS中,对象和函数也是变量。
在JS中,作用域为可访问变量,对象,函数的集合。

在JavaScript中,能够定义局部作用域或全局作用域

1.2.1 JS 局部作用域(也称函数作用域)

变量在函数内声明,变量为局部作用域(只能在函数内部访问)

局部变量,只能在函数内部使用

注意点:

  1. 因为局部变量只作用于函数内,所以不同函数可以使用相同名称的变量
  2. 局部变量在函数开始执行时创建,函数执行完成后局部变量会自动销毁

局部变量生命周期

函数执行时被创建,函数执行完毕后被销毁

1.2.2 JS 全局作用域

表述一

在JS中,所有在函数外定义的变量都是全局变量,它们在代码的任何部分都可以被访问。这被称为全局作用域

表述二(W3school)

在函数外定义,即为全局变量

全局变量有 全局作用域:网页上所有脚本和函数均可使用

fn()
// 此处可以调用变量name
console.log(name, 1)
function fn() {
    // 函数内部没有声明,该变量为全局变量
    name = "小明"
    // 此处可以调用变量name
    name = "张三"
    console.log("fn =>", name)
}

// 上述代码输出为
// fn => 张三
// 张三 1

注:上述代码,name声明在函数内,但是为全局变量(函数需要执行)

二、作用域链

作用域链是函数内部可以访问的变量和函数的集合。

当JS解释器开始执行一个函数时,会创建一个作用域链,这个作用域链是一个链表结构,它的头部是当前正在执行的函数的作用域,尾部是全局作用域。

当函数内部访问一个变量时,JS解释器会首先在当前作用域内查找这个变量,如果找不到,就会沿着作用域链向上查找,直到找到这个变量,如果最后还是找不到,就会报错

:在JS中,函数内部可以访问到外部定义的变量,是闭包的原理之一。这种特性是通过作用域链实现的