闭包是啥?
要先知道的概念
作用域
var g= 1
function a(){
console.log(g)
var m = 10
return function b(){
console.log(m)
}
函数a()
中可以访问g
,而在外面却不能访问m
,函数b()
中可以访问m
。在js中有作用域,作用域是单向的。
标记清除和引用计数
标记清除
在js中,当进入一个环境中,就会触发一个标记,离开时也会触发,这样在进入函数a()
是创建m
,退出函数,销毁m
变量
引用计数
垃圾回收时,会找到那些在堆中没有引用指向的地址,然后清除它。比如:
var a ={name: 'kitty'}
a = null // 解除引用,在下一次垃圾回收时,{name: 'kitty'} 将会被清理掉
闭包是啥?
回到这个问题
函数一执行,引用清除,变量就会被销毁,那我们要保留函数里的变量用什么方法呢?如果有一个引用一直指向这个变量,是不是就不会被销毁,按这种思路,直接把函数内的变量赋给全局函数,就不会被销毁了,但是这种方法不好,因为这样和全局变量就没区别了,但是如果我们返回一个函数,这个函数,访问了这个变量,然后我们执行的时候再拿到这个函数,这样不就相当于也被使用到了,这样变量就不会被销毁了
function a(){
var m = 5 // 这个m只有函数内部能被访问到
return function(){
return m
}
}
var b= a() // 5
// 变量m还在
b() // 5