先看着几行代码:
'use strict';function autoInc(init){ let x=init||0; return{ inc:function(){ x+=1; return x; } }}常识:
1 javaScript作用域 是”链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。因此键为inc的值:即匿名函数
function(){ x+=1; return x; }中的x会向上寻找父对象autoInc函数对象中的x,找到。
2 autoInc函数对象返回值
对于刚接触Javascript的小伙伴,很容易发蒙,不知道autoInc的返回值是x,还是匿名函数。其实,autoInc函数对象的返回值是一个对象
{inc: function{...}} //这是JS特有的object类型因此调用autoInc(8)的作用:此函数变量x内部赋值为8,并且返回这么一个对象{inc:function(){…}}
let fun = autoInc(8);3 闭包慎用 调用autoInc(8)完后,变量x在内存中会立即释放吗? 不会的。这就是闭包,因为fun对象,inc的键值,也就是这个匿名函数,在1中提到了,匿名函数用到了父函数autoInc中的定义的x了。这个匿名函数就是一个闭包。
因此闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
运用这个闭包:
let num = fun.inc(); //此时调用匿名函数,并且返回一个Number变量,为9为什么为9,因为变量x未在内存中立即释放,fun.inc()调用前,x的值还是8!
由此看见,调用闭包,改变父函数内部变量x的值。
所以,闭包可以看做是父函数autoInc对象的公用方法(Public Method),内部变量x可以看做是父函数autoInc的私有属性(PRivate value)。
你们觉得呢?
新闻热点
疑难解答