1. 作用域
作用域(scope)规定了变量能够被访问的“范围”,离开这个范围变量便不能被访问。
分为:局部作用域、全局作用域。
1.1 局部作用域
局部作用域分为:函数作用域、块作用域。
1. 函数作用域
在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。
函数的参数也是函数内部的局部变量。函数执行完毕,函数内部的变量实际被清空了。
2. 块作用域
在JavaScript中使用 { } 大括号包裹的代码称为代码块,代码块内部声明的变量,外部有可能无法被访问。
let 声明的变量会产生块级作用域, var 不会产生块级作用域。
const 声明的常量也会产生块作用域。
不同代码块之间的变量无法互相访问。
推荐使用 let 或 const 。
for 循环声明的变量,虽然在{ }外面,但是for是一个整体,默认变量都在{}里面。还有 if while 等等。
1.2 全局作用域
<script> 标签和 .js文件的最外层都是全局作用域。全局作用域中声明的变量,任何其他作用域都可以访问。
注意:
1.为 window对象动态添加的属性默认也是全局的,不推荐,比如 a=10,其实就是 window.a=10。
2.函数中未使用任何关键字声明的变量为全局变量,不推荐。
3.尽可能少声明全局变量,防止全局变量被污染。
1.3 作用域链 【重点】
作用域链 本质上是底层的变量查找机制。
可以理解为就近原则、冒泡。
在函数被执行时,会优先查找当前函数作用域中查找变量。如果找不到,则会依次逐级查找父级作用域直到全局作用域。
1. 嵌套关系的作用域串联起来形成了作用域链
2. 相同作用域链中按着从小到大的规则查找变量
3. 子作用域可以访问父作用域,但父级作用域无法访问子作用域。
1.4 垃圾回收机制
内存的生命周期
js中分配的内存,一般有如下生命周期:
1. 内存分配:声明变量、函数、对象时,系统自动分配
2. 内存使用:读写内存,也就是使用变量、函数等
3. 内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存
声明:
全局变量一般不会回收(关闭页面回收)
一般情况下局部变量的值,不用了,会被自动回收。
js垃圾回收机制-算法说明
引用计数。
定义“内存不再使用”,看一个对象是否有指向它的引用,没有引用就回收对象。
被引用一次,就计数+1,减少一个引用就-1,为0时,就释放内存。
标记清除法。
现代浏览器已经不再使用引用计数法了。
就是从根部(全局对象)出发,能到达就还是需要使用的,无法到达的就回收。
1.5 闭包
一个函数对周围状态的引用捆绑在一起,內层函数中访问到其外层函数的作用域。
简单理解:闭包 = 内层函数 + 外层函数的变量
function A() {
const a = 1
function B() {
console.log(a)
}
B()
}
A()
内层函数 function B() 和 变量a 与调用函数B() 属于闭包。
闭包作用:封闭数据,提供操作,外部也可以访问函数内部的变量。
标签:ES6,进阶,作用域,函数,JavaScript,回收,访问,内存,变量 From: https://www.cnblogs.com/hynz/p/17145411.html