对闭包的理解(JavaScript)

闭包在Js开发中占有很重的一个分量,它有很多好处,比如保持函数内部数据的私密性,同时它也会造成内存泄漏的问题。但是今天要讨论的是,为什么会有闭包或者是闭包是怎么产生的。
拿代码来说:
function createComparisonFunction(propertyName) { return function(object1, object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2){ return -1; } else if (value1 > value2){ return 1; } else { return 0; } }; }
当函数在创建时,会创建一个预先包含全局变量对象的作用域链,然后,当函数在被调用的时候,它会创建一个执行环境,把这个上下文压入JS全局执行环境的栈顶,同时它也会构建自己在执行环境(执行上下文)的作用域链(会复制上一级的作用域链),传进函数体内的参数(object1,object2,还有argument和this)称为活动对象(也就是本级执行环境上的作用域链中的值)。作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。无论什么时候在函数中访问一个变量时,就会从作用域链中搜索具有相应名字的变量
而当函数执行完毕的时候,它的执行环境会被压出栈进行销毁,但是由于函数的返回值包含着对活动对象的引用,所以活动对象没有办法消除,故作用域链也就没办法消除。如图:
对闭包的理解(JavaScript)
这种情况,就叫闭包。闭包的内存泄漏问题,就是函数执行完毕了,但是其作用域链并没有销毁,造成了内存泄漏。对于这种情况,我们只要解除对其活动对象的调用,就可以释放掉内存了。例:

var compareNames = createComparisonFunction("name");//调用

compareNames = null //	用完之后,解除调用

我的理解就这样啦,如果有什么问题或者不正确的地方,希望可以指出,共同进步~