前言
在JavaScript中,作用域(Scope)是变量与函数的可访问性的规则,决定了代码块中变量和函数的可见性和生命周期。
作用域链是函数内部可以访问的变量和函数的集合。
一、作用域
W3Cschool这样描述作用域
作用域是可访问变量的集合。
在JS中,能够定义 全局作用域 和 局部作用域。
在JS中,对象和函数也是变量。
在JS中,作用域为可访问变量,对象,函数的集合。
在JavaScript中,能够定义局部作用域或全局作用域
1.2.1 JS 局部作用域(也称函数作用域)
变量在函数内声明,变量为局部作用域(只能在函数内部访问)
局部变量,只能在函数内部使用
注意点:
- 因为局部变量只作用于函数内,所以不同函数可以使用相同名称的变量
- 局部变量在函数开始执行时创建,函数执行完成后局部变量会自动销毁
局部变量生命周期
函数执行时被创建,函数执行完毕后被销毁
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中,函数内部可以访问到外部定义的变量,是闭包的原理之一。这种特性是通过作用域链实现的