闭包

闭包的概念

闭包 : 如果一个「函数」使用了它范围外的「变量」,那么这个「函数」加上这个「变量」就是一个闭包。

最简单的闭包模型

var n;
function x(){
  console.log(n)
} 

有 return 和 函数包裹的闭包模型

function x(){
  var n= 666;
  function y(){
    console.log(n)
  }
return y
}
var z = x();
z()   //666

上面代码里的 y 函数与 n 变量就构成了一个闭包。

为什么要函数套函数呢?

是因为需要局部变量,所以才把 n 放在一个函数里,如果不把 n 放在一个函数里,n 就是一个全局变量了,达不到使用闭包的目的——隐藏变量。
函数套函数只是为了造出一个局部变量,跟闭包无关。

为什么要 return y 呢?

因为如果不 return,你就无法使用这个闭包。
return是要让外面可以访问到这个 y 函数就行了。
所以 return y 只是为了 y 能被使用,也跟闭包无关。

闭包的作用

1.读取函数内部的变量

function f1() {
 var n = 999;
  function f2() {
    console.log(n);
  }
  return f2;
}
var result = f1();
result(); // 999

上面代码中,函数 f1 的返回值就是函数 f2 ,由于 f2 可以读取 f1 的内部变量,所以就可以在外部获得 f1 的内部变量了。

2.让这些变量始终保持在内存中,即闭包可以使它诞生环境一直存在

function xxx(start) {
  return function () {
    return start++;
  };
}
var inc = xxx(5);
inc() // 5
inc() // 6
inc() // 7

上面代码中,start 是函数 xxx 函数的内部变量。通过闭包,start的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包inc使得函数 xxx 的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。

为什么会这样呢?

原因就在于 inc 始终在内存中,而 inc 的存在依赖于 xxx 函数,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收。

参考:方应杭:闭包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...
    lzyuan阅读 4,536评论 0 0
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,742评论 0 13
  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 要理解闭...
    青春前行阅读 1,882评论 0 0
  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 4,704评论 2 6
  • 卡尔维诺中文站留言板这个帖子专门用作卡尔维诺中文站的留言板,欢迎大家留言和提问。...阮一峰2007-01-04T...
    舟渔行舟阅读 2,695评论 0 1

友情链接更多精彩内容