- 闭包:有权访问另一个函数作用域中的变量的函数 要知道,平时我们在全局中是无法访问函数中的变量的如
function fn() {
var a = 77
}
console.log(a)//这样是访问不了函数中的变量a的
而闭包就很好的解决了这个问题
function fn() {
var a = 77
function fm() {
console.log(a)
}//这个函数决定被访问变量的操作方式
return fm
}
f = fn()
/* 运行fn的返回值为function fm(){
console.log(a)
}所以f等于这个函数 */
console.log(f)
f() //这个时候就能访问函数内部变量a
如果一个函数的变量能被其他函数访问,就称这个函数为闭包,这里fn就是闭包
外部操作闭包来间接访问函数内部的变量(只能访问,不能决定如何操作这个变量),只有闭包可以决定这个变量的操作方式(通过操作返回的那个函数决定如何操作变量)
- 利用函数自调用,每次调用内部的局部变量或者形参都是独立的 来保存一些临时数据
var arr = []
for (var i = 0; i < 5; i++) {
function fn() {
console.log(i)
}
arr[i] = fn
}
arr[2]() //5,因为for循环没有块级作用域,所以在函数运行时,for循环已经完了,这里的i为5,无法实现实时打印i的值
var arr = []
for (var i = 0; i < 5; i++) {
(function (index) {
arr[index] = function fn() {
console.log(index)
}
})(i)//利用函数闭包可以实时获取i的值
}
arr[2]()
arr[3]()