所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
闭包,看似很高大上的名字其实实质本质就是作用域应用的特殊情况:
- 函数作为参数被传递
- 函数作为返回值被返回
例子抬上来
- 函数作为返回值
function create() {
let a = 100
return function () {
console.log(a)
}
}
let fn = create()
let a = 200
fn() // 100
当函数fn执行时在全局作用域,函数定义在create的作用域,a是自由变量,当执行返回的函数时寻找的顺序就是先在执行的作用域寻找,当前作用于找不到就像上级寻找,所以找到了a=100
- 函数作为参数
function print(fn) {
let a = 200
fn()
}
let a = 100
function fn() {
console.log(a)
}
print(fn) // 100
同上原理一样寻找到a为100。
总结
- 自由变量的查找是在函数定义的地方,向上级逐级寻找,而不是在执行的地方。