js中的作用域和作用域链

107 阅读2分钟

以下内容为我学习相关知识后的理解,如有疏漏,敬请指摘,共同进步!

首先说一下作用域是个什么东西:
作用域就是一块独立的区域,每个变量只能在自己所在的作用域内被拿到值。
作用域可以嵌套,里面可以拿到外面的值,但是外面拿不到里面的值,
当里面和外面的变量发生命名冲突(即重名了),
变量就会被重写,用本作用域内的变量的值。

作用域分为
1、全局作用域
2、函数作用域
3、块作用域

前两个是ES6之前存在的,块作用域是ES6提出的。

在ES6之前,只有var能声明变量,并且只存在全局作用域和函数作用域,
全局作用域,即window下面的对象,任何能够被window用“.”点出来的(如window.a、window.b中的a、b)都是全局作用域下的变量。
全局作用域声明的变量能够在任意地方引用,
函数作用域即在函数的代码块中声明的变量。

块作用域是ES6提出的
通过ES6的let、const来实现。
所谓见名知意,一个代码块,即一个大括号包围的地方都是一个块作用域。

这里提一下,一个if、while、switch等声明的一个代码块(“{}”)中,不算一个作用域,
如果在if、while、switch等代码块中,用let、const声明变量,这个变量的作用域依然是一个代码块。
重要的不是怎么产生的这个代码块,重要的是谁声明的(是var还是let、const)。

至于作用域链,就是像上面说的,
作用域可以嵌套,如果在本作用域中找不到所要的变量,就会去他的父级作用域去找。
好吧,这里说的父级,也不是很对,
应该说是去编译这个函数的时候,创建这个函数的作用域去找。(这句话有点绕,大家可以找别的文章看看)

这里推荐给大家一篇文章