##作用域 我们可以理解为代码起作用的区域
JS中的作用域 有两种,分别是全局作用域 和 私有作用域
作用域 也可以说就是一块栈内存
栈内存 存储值类型 提供代码的运行环境 堆内存 存储引用数据类型
全局作用域: 页面一打开就会形成一个全局作用域 一个页面只有一个全局作用域
私有作用域: 函数执行的时候会 形成一个私有的作用域
全局变量 在全局声明的变量 叫做全局变量
私有变量 在私有作用域声明的变量 叫做私有变量 形参也是私有变量
上级作用域 外层作用域:查找规律,上级作用域是谁,就看这个函数是在哪个作用域声明定义的
对于私有作用域中的某些变量 若没有在私有作用域中声明过,那么函数执行时就会去上级作用域查找该变量 上级作用域若没有该变量 则 接着向上级查找,
直到查找到全局作用域 若仍没有 则报错:
作用域链: 变量的查找机制 一直向上级作用域查找
函数执行的过程 也可以这样理解
先开辟一个私有作用域(栈内存),形参赋值,然后变量提升 然后代码从上向下执行,
私有变量有: 形参 私有作用域中声明过的变量 其他的变量都是上级作用域的,
暂时性时区 在let 和const之前 不能使用他们声明的任何变量
es6 针对 let和 const 声明的变量 多了一个块级作用域({}), 理解成一个私有作用域即可
堆内存的销毁
用谷歌浏览器为例子; 会定期的查看整个堆内存 把没有被引用的堆内存销毁掉 (回收)
栈内存的销毁
全局作用域对应的栈内存:关闭页面的时候才会被销毁
私有作用域对应的栈内存:一般情况下 函数执行完成 对应的栈内存就会被销毁
当返回值是个引用数据类型时 不会被销毁