预解析之后 很多小伙伴会问了 函数和变量的预解析 是提升到当前作用域的最顶层 什么是作用域啊?
那么现在就来给大家介绍 作用域
变量的使用是有使用区间的, 变量不是说声明之后在哪里都可以用, 它有一个使用的范围(区间), 我们把这个范围叫做 “作用域”
作用域的分类
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)
然后在查找过程中, 我们把逐层向上的一层一层查找 所构成的一个链条 叫做 作用域链
注意: