什么是闭包?

闭包的使用在许多高级程序都能够有用到。

闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会增加内存消耗。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。或者说闭包就是子函数可以使用父函数的局部变量,还有父函数的参数。

变量的作用域

要理解闭包,首先必须理解Javascript特殊的变量作用域。

变量的作用域无非就是两种:全局变量和局部变量。


//变量声明时如果不使用var关键字,那么它就是一个全局变量,即便它在函数内定义。

所有函数都能访问全局变量。

实际上,在 JavaScript 中,所有函数都能访问它们上一层的作用域。

JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。

使用闭包的注意点

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

闭包的概念

function f1(){

var n=999;

function f2(){

alert(n);

}

return f2;

}

var result=f1();

result(); // 999

上一节代码中的f2函数,就是闭包。

各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。 1、变量作...
    乖乖果效36阅读 492评论 0 0
  • 之前傻傻分不清 匿名函数 和 闭包 这两个概念,因此经常混用。闭包 是指有权访问另一个函数作用域中的变量的函数。创...
    BertFu阅读 379评论 0 1
  • “左边,好,你随意就好” “很好,小苏(造型师)去把领口整理一下,开大一点,衬衣拿出来,不要扎在裤子里” “吴世勋...
    SH_94阅读 166评论 0 0
  • 文/Asura. 列车错过,我不知道什么时候来的! 除了轰隆的空洞,就是无暖的...
    Asuria阅读 388评论 2 8
  • 为人父母最需要做的是等待。孩子是自我成长的,而不是大人教出来的。大人要做的是扒开阻碍他成长的障碍。就像一株小草,你...
    小山羊_77bb阅读 174评论 0 0