js: 闭包

闭包是啥?

要先知道的概念

作用域

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 

你可能感兴趣的:(js: 闭包)