一、什么是闭包 

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

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

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

二、辨别闭包

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. 3.strcpy使用注意(3)

    void test3(char * str1) { if(str1==NULL) { return; } char string[10]; if(strlen(str1)<=10) { strc ...

  2. zabbix项目实践

    一,Zabbix生产环境监测案例概述 1.1 项目规划 [x] :主机分组 交换机 Nginx Tomcat MySQL Apache PHP-fpm redis(也有状态页, 自己研究) memca ...

  3. linux上定时运行scrapy

    1 运行方式一 (proxy-ip) [root@192 ~]# cd /data/test-proxy-ip/ (proxy-ip) [root@192 test-proxy-ip]# scrapy ...

  4. C++静态成员变量和静态成员函数

    数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...

  5. L221

    Hyundai has shown off a small model of a car it says can activate robotic legs to walk at 3mph (5km/ ...

  6. 【转】DelphiXE10.2.3——跨平台生成验证码图片

    原文地址 Java.PHP.C#等很容易在网上找到生成验证码图片的代码,Delphi却寥寥无几,昨天花了一整天时间,做了个跨平台的验证码,可以用在C/S和B/S端,支持Windows.Linux.An ...

  7. 关闭所有的screen

    由于开了很多个screen同时工作,关闭是一个一个比较麻烦,写个命令在这以便日后想不起来时可以用到.1.先看看有多少个screen screen -ls |awk '/Socket/'|awk '{p ...

  8. 读博 在没有导师PUSH的情况下该何去何从?

    读博已有两月之久,与导师也是仅有的一面之缘,短短数分钟谈话大致总结便是看看基础知识,再然后就没有什么了,突然之间有些小懵逼.突然间感慨这就是我的博士生涯的生活,这就没有啦,以后就这么过啦?在读博士之前 ...

  9. RequireJs 与 SeaJs的相同之处与区别

    相同之处: RequireJS 和 Sea.js 都是模块加载器,倡导模块化开发理念,核心价值是让 JavaScript 的模块化开发变得简单自然. 不同之处: 定位有差异.RequireJS 想成为 ...

  10. Windows10 解决“装了 .NET Framework 4.5.2/4.6.1/4.7.1等等任何版本 或版本更高的更新”问题

    ========================================================= 系统自带的.net framework版本为4.7,自己安装.NET Framewo ...