理解js作用域、作用域链

133 阅读2分钟

作用域

首先看下官方的定义:作用域是可访问变量的集合

是不是看的云里雾里,说实话我也不知道是啥意思

首先我们把上面的话拆分下,有提到'变量'两字,那么先看看变量的划分

1、全局变量:变量在函数外定义

2、局部变量:变量在函数内声明

var a = "全局变量" //我是全局变量
function b() {
    var c = "局部变量" //我是局部变量,在函数内声明
}

我们在来打印看看

console.log(a) //输出"全局变量"
console.log(c)//输入undefined

可以看出,局部变量是无法获取到数据的,我们再来看看刚刚的定义:作用域是可访问变量的集合,因为变量有两种,那么我们也可以知道,作用域也有两种

1、全局作用域,对应全局变量

1、局部作用域,对应局部变量

var a = "全局变量" //我是全局作用域
function b() {
    var c = "局部变量" //我是局部作用域,在函数内声明
}

console.log(a) //输出"全局变量",全局作用域可以直接访问
console.log(c)//输入undefined,局部作用域,只能在函数内访问

作用域链

我们说到链子一般会想到什么,链条、绳子、直线

话不多说直接上代码

var a = "全局变量" //我是全局作用域
function b() {
    var c = "局部变量" //我是局部作用域,在函数内声明
    console.log(a) //我在向作用域上一层一层往外找,打印"全局变量"  
    console.log(c) //我在向作用域上一层一层往外找,打印"局部变量"
}

仔细看看打印的数据,全部是有数据的

作用域链就是一层一层向上寻找的过程,直到找到全局作用域还是没找到,就宣布放弃。像不像顺着绳子向上爬的过程,这就是作用域链