一、作用域
在 JavaScript 中作用域类型:
1.局部作用域:只能在函数内部访问
函数内部定义的变量从函数外部是不可见的 (也就是说 子能用父)
2.全局作用域:网页的所有脚本和函数都能够访问
函数外部定义的变量,函数内部是可以调用的(父不能用子)
每个函数创建时都会产生作用域
作用域决定了变量的可见性 (就是在哪能用 在哪不能用)
作用域:变量生效的范围
3.块级作用域
是一个语句,将多个操作封装在一起,通常是放在一个大括号里,没有返回值。
在ES6之前,函数只能在全局作用域和函数作用域中声明,不能在块级作用域中声明。没有块级作用域导致很多场景不合理
内存变量可能覆盖外层变量
用来计数的循环变量泄露为全局变量
ES6中的块级作用域:
1、允许块级作用域任意嵌套,外层作用域无法读取内层作用域的变量
2、内层作用域可以定义外层作用域的同名变量
3、不需要立即执行匿名函数
立即执行函数
二、作用域链
当查找变量的时候,会先从当前上下文的变量对象中查找
没找到,会从父级执行上下文的变量中查找,一直找到全局上下文的变量对象,也就是全局对象
这样由多个执行上下文的变量对象构成的链表就叫做作用域链
说人话就是多个作用域嵌套从而产生了作用域链