作用域!

96 阅读2分钟

预解析之后 很多小伙伴会问了 函数和变量的预解析 是提升到当前作用域的最顶层 什么是作用域啊?

那么现在就来给大家介绍 作用域

变量的使用是有使用区间的, 变量不是说声明之后在哪里都可以用, 它有一个使用的范围(区间), 我们把这个范围叫做 “作用域”

作用域的分类

1. 全局作用域

JS 给我们提供了一个叫做 window 的全局作用域, 可以理解为 整个 script 标签内的作用域, 就是全局作用域

2. 局部作用域

在 JS 中, 有且只有函数能够创建局部作用域(函数作用域), 局部作用域开始和结束位置, 就是函数代码段的开始和结束位置 在局部作用域(函数作用域)内声明的变量叫做局部变量 局部变量 不会挂载到 window 对象上

变量的作用域

根据作用域的不同 变量可分为两种:

全局变量 和 局部变量

全局变量:在全局作用域下的变量 在全局下都可以使用

注意:(在函数内部未声明但赋值的变量属于全局变量)

局部变量:在局部作用域(函数作用域)下的变量 只能在函数内部使用

注意:(函数的形参属于局部变量)

例:
全局作用域:
<script>

var num = 100           // 全局变量
console.log(num)     //100

</script>


局部作用域:
<script>

 function fn() {                  // 局部作用域                      
 var num = 10000                  //局部变量
 console.log(num)                 // 10000
}
  fn()
console.log(num)          //num is not defined
</script>


全局变量和局部变量的区别

从执行效率来看

全局变量只有在浏览器关闭的时候才会销毁 比较占内存

局部变量在程序运行完毕后就会销毁 比较节约内存资源

以局部变量为荣, 以全局变量为耻

接下来我们要引入一个纯概念的东西 实际是没有的 叫什么呢 叫“作用域链”

作用域链简单来说 遵循一个原则 就近原则

在查找变量时, 会先在当前作用域内查找, 找到就用, 没找到去上层查找, 一直会查找到顶层作用域(全局---window)

然后在查找过程中, 我们把逐层向上的一层一层查找 所构成的一个链条 叫做 作用域链

注意:

作用域链 只会向上查找, 不会向下