什么是闭包(closure):

当你声明一个局部变量时,这个局部变量有作用域,通常局部变量值只存在于你定义的Block or Function中:

function() {
var a = 1;
console.log(a); // works
}
console.log(a); // fails

如果你想要尝试访问一个局部变量,大多数的语言都会在当前作用域去找,然后去找上一层的作用域,最后找到根作用域(root scope)

var a = 1;
function() {
console.log(a); // works
}
console.log(a); // works

当一个Block or Function工作完后,我们就不需要它的局部变量了,所以我们就把它丢出内存了

这是我们普遍希望这样做的

闭包就是永久存在的局部变量

举个例子吧:

outer = function() {
var a = 1;
var inner = function() {
console.log(a);
}
return inner; // this returns a function
} var fnc = outer(); // execute outer to get inner
fnc();

这里我定义了一个函数内的函数。内部函数可以访问所有外部函数的局部变量,包括a。该变量a在内部函数的范围内。

通常,当一个函数退出时,它的所有局部变量都会被消灭。但是,如果我们返回内部函数并将其分配给一个变量fnc,以便它在outer退出后保持不变,那么inner定义范围内的所有变量也会保留。该变量a已被关闭 - 它在闭包内。

请注意,该变量a是完全私有的fnc。这是一种使用JavaScript等函数式编程语言创建私有变量的方法。

正如您可能会猜到的那样,当我使用fnc()它会打印出a“1”的值。

在没有闭包的语言中,a当函数outer退出时,变量将被垃圾收集并抛弃。调用fnc会引发错误,因为a不再存在。

在JavaScript中,变量a持续存在,因为变量作用域是在函数首次声明时创建的,只要函数继续存在,该变量就一直存在。

a属于作用域outer。作用域inner有一个指向范围的父指针outerfnc是一个指向的变量innera只要fnc持续存在,就会持续存在。a在闭包之内。

这里我定义了一个函数内的函数。内部函数可以访问所有外部函数的局部变量,包括a。该变量a在内部函数的范围内。

通常,当一个函数退出时,它的所有局部变量都会被吹走。但是,如果我们返回内部函数并将其分配给一个变量fnc,以便它在outer退出后保持不变,那么inner定义范围内的所有变量也会保留。该变量a已被关闭 - 它在闭包内。

所以闭包总结为:

如果在一个内部函数里,对外部作用域(但不是在全局作用域的变量)进行引用,那么内部函数就会被认为是闭包。 

对闭包的理解(closure)的更多相关文章

  1. 对JavaScript闭包的理解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 在开始了解闭包前我们必须要先理解JavaScript的变量作用域. 一.变量的作用域无非就是两 ...

  2. Javascript闭包学习(Closure)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  3. 对js中局部变量、全局变量和闭包的理解

    对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...

  4. 【JS】闭包的理解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无 ...

  5. 对JavaScript中局部变量、全局变量和闭包的理解

    对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...

  6. javascript中重要概念-闭包-深入理解

    在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入.本人经过一段时间的学习,对闭包的概念又有了新的理解.于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给 ...

  7. 个人对js闭包的理解

      闭包算是前端面试的基础题,但我看了很多关于闭包的文章博客,但感觉很多对于闭包的理想还是有分歧的,现在网上对闭包的理解一般是两种: 有些文章认为闭包必须要返回嵌套函数中里面用到外面函数局部变量的方法 ...

  8. 我对 javascript 闭包的理解

    学js的学到闭包,但是理解不深. 后来看了一下这篇文章: 地址:http://leepiao.blog.163.com/blog/static/4850313020112835355917/ 内容如下 ...

  9. JS学习之闭包的理解

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量.另 ...

随机推荐

  1. 新概念英语(1-121)The man in a hat

    Why didn't Caroline recognize the customer straight away ?A:I bought two expensive dictionaries here ...

  2. 新概念英语(1-a)句子集锦

  3. 命名参数名(含*args , * *kw的区别)

    要限制关键字参数的名字,就可以用命名关键字参数 # coding=utf-8 # 命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数.调用方式如下 def person(name, ...

  4. js实现继承的5种方式

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  5. Convert.ToInt32、(int)和int.Parse三者的区别

    前者适合将object类类型转换成int类型 (int)适合简单数据类型之间的转换: int.Parse适合将string类类型转换成int类型.

  6. Linux OpenGL 实践篇-5 纹理

    纹理 在之前的实践中,我们所渲染的物体的表面颜色都是纯色或者根据顶点位置计算出的一个颜色,这种方式在表现物体细节方面是比较吃资源的,因为我们每增加一个细节,我们就需要定义更多的顶点及其属性.所以美术人 ...

  7. java代码优化细节

    在代码线上运行的过程中,往往会出现很多我们意想不到的错误,不少错误定位到最后往往是一个非常小的原因导致的.然而因为线上环境和开发环境是非常不同的,为了解决一个错误,我们需要先查找错误原因.修改验证.打 ...

  8. 解决将/etc/passwd文件中1000改为0后只能guest进入系统的问题 ||ubuntu下将普通用户权限升级为root用户权限的方法;

    其实我现在才知道linux系统对于用户权限管理比较严,在ubuntu下系统不允许root权限的用户进入图像界面系统.由于之前没弄过权限这个东西瞬间掉坑了了. 我是想修改一下root下的nginx.co ...

  9. [LeetCode] Design Log Storage System 设计日志存储系统

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

  10. 前端监控系统(二)JS错误日志收集篇

    前端监控系统 目前已经上线,欢迎使用! 服务器搭建好了,可以着手开发了. 其实前端需要分析的数据有很多,包括,PVUV, 接口请求统计,耗时统计,JS错误统计,用户使用设备统计,用户地域分布,页面用户 ...