作用域链
作用域:全局作用域、局部作用域 局部作用域:当声明了一个函数,函数内部就形成了一个局部作用域。 作用域链:当执行代码的时候,如果要访问一个变量,首先看变量是否在自己的局部作用域里面,如果是就直接用,如果没有就往上一级的作用域中查找,一直查找到全局作用域。这就形成了一个链,作用域链(作用域链的查找机制)
例子:
<script>
let a = 1
function g() {
let a = 2
function f() {
a++
console.log(a)
}
f()
return f
}
let b = g()
b()
console.log(a)
// 结果 3 4 1
</script>
闭包
闭包:函数嵌套函数,内部的函数就是闭包。 内部的函数,可以访问外部函数的局部变量
- 问题:正常情况下,函数执行完毕,内部局部变量会销毁(销毁:释放内存空间),但是闭包的内部函数没有执行完成,外部函数的变量不会被销毁
- 解决:函数执行完毕后,给变量手动赋值为null
- 闭包的应用:封装一段代码,实现模块化功能。防止全局污染。内部的局部变量是独立的。