资讯专栏INFORMATION COLUMN

浅谈JavaScript中的闭包

Riddler / 1091人阅读

摘要:在内部,理所当然能访问到局部变量,但当作为的返回值赋给外的全局变量时,神奇的事情发生了在全局作用域中访问到了,这就是闭包。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。

一、闭包是什么?

《JavaScript高级程序设计》中写道:“闭包是指有权访问另一个函数作用域中的变量的函数”,如果用下定义的观点看,这句话就是说“闭包是函数”,我带着怀疑的心态又去网上找了找,发现什么说法都有,终究没能明白闭包的含义,还是看代码来得直接。

function outter(){
  var sky="blue";
  function inner(){
    console.log(sky);
  }

  return inner;
}
var result=outter();
result();    //"blue"

这段代码就包含一个简单的闭包:outter函数的返回值是一个函数,即inner。inner在outter内部,理所当然能访问到局部变量sky,但当inner作为outter的返回值赋给outter外的全局变量时,神奇的事情发生了:在全局作用域中访问到了sky,这就是闭包。

二、闭包的原理?

每个函数都有自己的执行环境,当一个函数被执行时,它的执行环境就会被推入环境栈,其活动对象(存储环境中定义的变量及函数)加入作用域链中,一旦函数执行完,栈将其环境弹出,活动对象被销毁。

对于上面的例子来说,outter执行完之后将返回inner给了result,outter的执行环境从环境栈弹出,控制权交给全局环境,outter的活动对象理应被销毁。但此时inner已经存储在全局活动对象中了,同时inner需要访问sky,所以outter的活动对象没有被销毁,即使result执行完毕,outter的活动对象依然存在于作用域链中,只有当result被销毁

result = null;

outter的活动对象才会彻底释放。

三、闭包有什么用?

说了这么多,闭包到底有什么用呢?我个人认为闭包最大的用处就是防止对全局作用域的污染。 试想如果我们把一些仅仅只用到一两次的变量都声明在全局作用域中,最后肯定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。

四、Caveat

闭包将函数的活动对象维持在内存中,过度使用闭包会导致内存占用过多;

闭包只能取得外部函数中任何变量的最后一个值,在使用循环且返回的函数中带有循环变量时会得到错误结果;

当返回的函数为匿名函数时,注意匿名函数中的this指的是window对象。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83882.html

相关文章

  • 浅谈Javascript闭包和匿名函数【1】

    摘要:我们可以用普通函数内部嵌套匿名函数,形成一个闭包来使变量驻留在内存中。局部变量闭包为什么要将赋值给变量呢这里我们就要谈到匿名函数调用问题匿名函数如何调用还是上面的例子会将整个函数体打印出来这样才调用了函数内部的匿名函数看到这里。 闭包含义: 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。 这...

    cyqian 评论0 收藏0
  • 云天视角-浅谈闭包

    摘要:函数在执行的时候执行函数,将当前的变量对象由于当前的环境是函数,所以将其活动对象作为变量对象添加到作用域链的前端。此时,由于在执行,而作用域链也存在,所以可以在作用域链上进行查找,去访问的变量。 一、现状 闭包是jser绕不过的坎,一直在都在说,套用 simpson 的话来说:JavaScript中闭包无处不在,你只需要能够识别并拥抱它。 闭包是基于词法作用域书写代码时的自然结果,你甚...

    nanfeiyan 评论0 收藏0
  • 浅谈JavaScript闭包

    摘要:但是函数返回了内部函数,内部函数会随时访问变量所以垃圾回收机制是不会回收函数的内部作用域的,这就是闭包的含义。也就是函数在定义的词法作用域以外的地方被调用,闭包使得函数可以继续访问定义时的词法作用域。   初学JavaScript闭包时,闭包这个概念在我眼里及其的神秘,也不知道这个东西在讲什么,尤其某些地方的闭包概念定义的非常抽象,属于那种本来你可能明白这个概念,看了反而又把你给绕糊涂...

    hsluoyz 评论0 收藏0
  • 浅谈JavaScript闭包的理解

    摘要:关于循环和闭包当循环和闭包结合在一起时,经常会产生让初学者觉得匪夷所思的问题。闭包是一把双刃剑是比较难以理解和掌握的部分,它十分强大,却也有很大的缺陷,如何使用它完全取决于你自己。 在谈闭包之前,我们首先要了解几个概念: 什么是函数表达式? 与函数声明有何不同? JavaScript查找标识符的机制 JavaScript的作用域是词法作用域 JavaScript的垃圾回收机制 先来...

    missonce 评论0 收藏0
  • 浅谈Javascript闭包中作用域及内存泄漏问题

    摘要:将作用域赋值给变量这里的作用域是,而不是将作用域赋值给一个变量闭包返回浏览器中内存泄漏问题大家都知道,闭包会使变量驻留在内存中,这也就导致了内存泄漏。 上一章我们讲了匿名函数和闭包,这次我们来谈谈闭包中作用域this的问题。 大家都知道,this对象是在运行时基于函数的执行环境绑定的,如果this在全局就是[object window],如果在对象内部就是指向这个对象,而闭包却是在运行...

    source 评论0 收藏0

发表评论

0条评论

Riddler

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<