什么是闭包(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. 图数据库orientDB(1-2)例子

    http://gog.orientdb.com/index.html#/infotab 小朱25岁,出生在教师家庭并且有个姐姐小田,他现在奋斗在帝都.  那么SQL是这样滴!!! CREATE VER ...

  2. JavaScript 以及 css3进度条

    JavaScript css3进度条 使用css3实现进度条 <!DOCTYPE html> <html lang="en"> <head> & ...

  3. Python scrapy框架

    Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设 ...

  4. SourceTree 01 - git 客户端介绍

    SourceTree - git客户端介绍 SourceTree系列第1篇 --->> SourceTree 01 - git 客户端介绍(http://www.cnblogs.com/g ...

  5. 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)

    在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)

  6. js正则表达式入门以及常见用例

    学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实验.下面给出了不少简单的例子,并对它们作了详细的说明. 假设你在一篇英文小说里查找hi,你可以使用正则表达式hi. 这几乎是最 ...

  7. vue中实现全选功能

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>Vue ...

  8. *Boosting*笔记

    集成算法之boosting 集成方法  1. Parallel methods:   1. bagging   2. Random Forest  2. Sequence methods:   1. ...

  9. Multipath在OpenStack中的faulty device的成因及解决(part 1)

    | 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 简介: Multip ...

  10. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...