首页 > 网站 > WEB开发 > 正文

透过几行代码看闭包

2024-04-27 15:04:54
字体:
来源:转载
供稿:网友

先看着几行代码:

'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)。

你们觉得呢?


上一篇:web.xml配置详解

下一篇:css伪类

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表