一、什么是闭包 

函数可以记住并访问所在词法作用域时,就产生了闭包,即使在词法作用域外调用函数。

(也就是说如果一个函数在执行完之后,其中的内部包含的函数仍然对该函数的作用域持有着引用(函数执行完之后,内存没有被释放,

因为还一直被引用着),那么这个引用就是一个闭包)

二、辨别闭包

1、也就是这样的一个函数也不能算做真正的闭包,对变量a的查找其实只不过是遵循词法作用域找到的。

function foo1() {
var a = 3;
function foo2() {
console.log(a)
}
foo2()
} foo1()

执行函数foo1,将foo1内部的函数引用返回给全局变量foo,foo1执行完,内存没有被回收,因为foo一直引用着foo1中的foo2函数,foo1内存不会被释放。通过foo可以随时访问foo1中的变量。

var a = 4
function foo1() {
var a = 3
function foo2() {
console.log(a)
}
return foo2
}
var a = 5
var foo = foo1() 
foo() //3

  

无论通过何种方式将内部函数的引用传递到所在词法作用域以外再去调用。  

var a = 4
function foo1() {
var a = 3
function foo2() {
console.log(a)
}
bar(foo2)
} function bar(fn) {
var a = 6
fn()
} foo1()

  

2、定时器、事件监听器、Ajax请求、跨窗口通信、web works或任何其他的异步任务中,只要用了回调函数(回调函数执行实质是在当前词法作用域以外的作用域调用的,这也就是为什么回调函数中的this不是指向代码书写的词法作用域的原因),就是在使用闭包。

三、闭包的使用

1、典型案例

每隔1秒打印一个11,创建了10个定时器,每个定时器里面都引用同一个i

for(var i = 1; i<11; i++) {
setTimeout(function(){
console.log(i)
}, 1000*i)
}

  

循环打印数字,打印1到10的数,每隔一秒打印1个数:

for(var i = 1; i<11; i++) {
(function(i) {
setTimeout(function(){
console.log(i)
}, 1000*i)
})(i)
}
for(let i = 1; i<11; i++) {
setTimeout(function(){
console.log(i)
}, 1000*i)
}

2、创建模块  

  

  

Javascript中的闭包(六)的更多相关文章

  1. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  2. 难道这就是JavaScript中的"闭包"

    其实对于JavaScript中的"闭包"还没真正理解,这次在实际Coding中似乎遇到了"闭包"的问题,仅此摘录,以待深究. 表现为jQuery的post方法回 ...

  3. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  4. javascript中的闭包解析

    学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...

  5. JavaScript中的闭包理解

    原创文章,转载请注明:JavaScript中的闭包理解  By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...

  6. 【JS】JavaScript中的闭包

    在JavaScript中,闭包指的是有权访问另一个函数作用域中的变量的函数:创建闭包最常见的方式就是在一个函数内创建另一个函数.如下例子: function A(propertyName){ retu ...

  7. Javascript中的闭包(转载)

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  8. 狗日的Javascript中的闭包

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  9. [译]Javascript中的闭包(closures)

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  10. javaScript中的闭包原理 (译)

    这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...

随机推荐

  1. [Android Studio] Android Studio常用快捷键

    [Android Studio] Android Studio常用快捷键   (会持续更新)这边讲的常用快捷键是指做完Keymap到Eclipse后的,不是纯Android Studio的,这边主要讲 ...

  2. python 的StringIO

    python 3.4以后StringIO和cStringIO就没有了,转移到 io,的StringIO和BytesIO from io import StringIO fp=StringIO( ) 1 ...

  3. 由pg_xlogdump统计信息想到的问题

    最近深入理解了Checkpoint的相关逻辑,再来看WAL日志的一些设置,又有了新的收获. 1.回顾pg_xlogdump出来的wal日志信息: 2.wal中FPI的占比很高问题分析: 3.重申ful ...

  4. dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)

    在上一个项目中遇到一些jar包冲突的问题,之后还有很多人分不清楚dependencies与dependencyManagement的区别,本篇文章将这些区别总结下来. 1.DepencyManagem ...

  5. MySQLzip压缩文件格式安装教程

    MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行.但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的.很多人下了zip格式的解压发现没有setup.exe,面对一堆文件一头雾 ...

  6. ORA-10922 Temporary tablespace group is empty错误

    错误--练习查询,发现报错: SQL>  select * from range_list_part_tab where id=100000Execution Plan------------- ...

  7. IplImage 与mat之间的转换及释放内存

    IplImage *x = cvLoadImage(savefilename, ); Mat img(x,true); cvReleaseImage(&x); 完

  8. HUD 1969:Pie(二分)

    Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  9. 【HAOI2016】食物链

    HA真是弱…… 原题: 1.食物链[问题描述]如图所示为某生态系统的食物网示意图,据图回答第1小题. 1.数一数,在这个食物网中有几条食物链( )现在给你n个物种和m条能量流动关系,求其中的食物链条数 ...

  10. echar生成雷达图

    function createRadarChart(indicatorData, personData) { var myChart = echarts.init(document.getElemen ...