什么是闭包

什么是闭包,第1张

什么是闭包 javascript的“闭包”是什么?

在javascript中,闭包是一个难点,也是一个特色,很多高级应用都得靠它实现,而且也是不太容易完全理解的;闭包,顾名思义,就是封闭的,不对外开放的函数语句块,你创建一个函数,实际上它就是一个闭包,不过,闭包通常是在函数内部,即函数中的函数,从而形成“链式作用域”。

当然要理解闭包,我们得思考为什么会有闭包这种概念,它的作用是什么?下面通过几个例子来说明下:一、代码封装在js中,函数外部全局变量对函数内部是可见的,而在函数内部定义的变量,对外是不可见的。

利用这个特性,在开发中可以用闭包的形式封装重要变量:这样封装,变量age对外是不可见的,但是,在外部却是可以 *** 作变量age的。

二、缓存在闭包中引用的变量,外层函数调用后,是不会被垃圾回收机制回收的,可用于缓存计算的结果集,在下次使用时不用重新计算,对性能方面有一定提升;不过,这种情况是会造成内存泄漏的,所以,建议慎用闭包。

obj1在第三次调用的时候,其值为3,说明函数调用后,a的值一直缓存在内存中。

三、自动执行(IIFE模式)用IIFE模式创建一个匿名函数,它会自动执行,在它内部的变量对外是不可见的。

在闭包内部把age的值改为30,data对象仍没有改变,避免了污染全局变量。

经典面试题思考一、闭包中,this指向问题。

二、定时器与闭包三、变量引用与闭包看懂这三道面试题,对闭包的理解基本差不多了,另外,有不对的地方,还望高人指点。

觉得不错的童鞋,用你发财的小手点个赞呗,蟹蟹支持。

闭包是指函数和其词法环境的组合——假设函数A包含了函数B,B里面又包含了函数C,A(){B(){C(){}}}假设每个函数都内部定义了自己的局部变量,那么函数C的词法环境(它可以调用的变量范围)是A和B以及C自己内部所有的变量环境;函数B的话,它没法调用子函数C的内部环境,可以用A和B自己本身的环境;A的话只能用自己内部词法环境,连B的也拿不到。

这就是闭包的基本含义,再举个例子来说明应用:假设我现在想用for循环和console.log来输出循环的值:for(var i=0;i<5;i++){console.log(i)}运行结果是输出0,1,2,3,4;现在我想1秒(1000毫秒)后输出一次这个结果,即输出时设置个时间间隔即在for中添加setTimeout(funcname,1000);来实现每隔1000毫秒执行一次这个funcname函数,代码如下:for(var i=0;i<5;i++){setTimeout( function timer(){console,log(i);},1000);}运行结果试一下,结果却是输出了5个5,不是预期的01234;回到ABC模型,for的环境看作A,环境中i值从0变到4;setTimeout看作函数B,console.log看作函数C,由于没有定义局部变量,BC和A的词法环境都是一样的;当A中执行完循环时,i最终为5,并设置了5个setTimeout函数B,在1秒后,B函数执行内部的C函数来输出i,由于C函数词法环境和AB一样,1秒后for循环已结束i值为4,执行完i++值为5,此时连续输出5个5;下面我们设置个闭包来把每种i值在取值后通过函数将其限定为局部变量:for(var i=0;i<5;i++){(function(i){setTimeout( function timer() {console,log(i);},1000);})(i);}即在for中,通过(function(i){原函数内容})(i);的形式,将i值传递到该函数中成为该函数的词法环境,设该函数为D,此时变成了:A{D{设定i值{B{C{}}}}};BCD的词法环境都是A的基础上外加传入的i值,闭包也就发挥了它限定词法环境的作用,代码也就可以按预期输出了~

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/4232760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-27
下一篇 2022-10-27

发表评论

登录后才能评论

评论列表(0条)

保存