一、什么是闭包 

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

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

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

二、辨别闭包

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. Flask初级(十)flash与前台交互post详解

    Project name :Flask_Plan templates:templates static:static POST提交方式,首先要有表单 老实去改模板文件吧. 查询窗口我准备放在页面最顶上 ...

  2. 【DevExpress v17.2新功能预告】改进DevExtreme编辑器

    DevExpress即将发布v17.2版本,在DevExtreme v17.2中,DevExtreme编辑器进行了一些改进. 除了dxScheduler,dxDataGrid,dxTreeList和d ...

  3. Java实现责任链模式

    责任链模式: 将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它.通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合. 责任链模式的优缺点: 优点:高内聚,低耦合.业务 ...

  4. jq 的onchange事件

    按商品类型显示:<select onchange="location.href='__ACTION__/type_id/'+this.value;">    <o ...

  5. screen 命令 http://man.linuxde.net/screen

    http://man.linuxde.net/screen -A 将所有的视窗都调整为目前终端机的大小. -d <作业名称> 将指定的screen作业离线. -h <行数> 指 ...

  6. node+mongoose使用例子

    https://github.com/Aquarius1993/nodeNotes 功能 1. 注册 2. 登录 3. 修改密码 4. 修改头像 5. 获取用户笔记 6. 添加,删除,更新笔记 安装部 ...

  7. QT 5.4.1 for Android Ubuntu QtWebView Demo

    QT 5.4.1 for Android Ubuntu QtWebView Demo 2015-5-15 目录 一.说明: 二.参考文章: 三.QtWebView Demo在哪里? 四.Qt Crea ...

  8. shell 脚本实战笔记(10)--spark集群脚本片段念念碎

    前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd &quo ...

  9. 会声会影X7安装不了,总是提示已经安装其他版本,怎么办

    会声会影X7安装不了,总是提示已经安装其他版本,怎么办 卸载c++2008,安装会声会影,ok. 卸载工具:Windows Install Clean Up

  10. Spring整合struts的配置文件存放问题

    只使用Spring的时候,我把applicationContext.xml是放在项目的src路径下的,这样使用ClassPathXmlApplicationContext很方便嘛 整合了struts之 ...