什么是闭包

当函数可以记住所在的词法作用域时,就产生闭包,即使函数是在当前词法作用域之外执行。

补充:什么是词法作用域

词法作用域是由你写代码时将变量和块级块级作用域写在哪里所决定的

function wait(message) {setTimeout(function timer() {console.log(message);}, 1000);
}
wait("Hello, closure!");

当 wait 执行 1 秒后,它的内部作用域并不会消失,timer() 函数仍然保有 wait() 作用域的闭包 ,这就产生闭包

在定时器、事件监听器、Ajax请求、跨窗口通信、Web Workers 或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包!!

案例

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

很明显输出结果是 6

但改成

for(var i = 1; i <= 5; i++) {setTimeout(function timer() {console.log(i);}, 0);
}

输出还是为 6

原因:

​ 当我们使用 for 循环时,虽每次循环都会给自己“捕获一个 i 的副本” ,但在这里 i 是被封闭在一个共享的全局作用域下(即上图y中的最外层)。因此, 实际 i 只有一个。

包括延迟1000毫秒在执行其内部也是这个原理,并不是因为延迟造成的

此时,我们应该在每次循环时,要都能产生闭包。

要产生闭包,必须满足俩个条件两者缺一不可

  • 产生气泡(函数)
  • 存在作用域(存在类似于 var a = key)
for(var i = 0; i <= 5; i++) {(function () {setTimeout(function timer() {console.log(i);}, i * 1000)})()
}

输出结果为 6 个 undefined

原因:立即执行函数中并不存在作用域,只产生气泡

for(var i = 0; i <= 5; i++) {(function () {var j = i; // 使立即函数产生作用域setTimeout(function timer() {console.log(j);}, j * 1000)})()
}

或者

for(var i = 0; i <= 5; i++) {(function (j) {setTimeout(function timer() {console.log(j);}, i * 1000)})(i);
}

补充:在闭包中,只是创建了一个函数(产生一个封闭的空间),函数中并没有变量(引用外层气泡中的变量),是产生不了闭包。

对于JavaScript产生闭包的个人理解相关推荐

  1. javascript中闭包的一些理解

    闭包是javascript中绕不开的话题,关于闭包的一些概念和应用,这方面资料比较多,在此就不再赘述.众所周知,闭包的一个作用就是 让一些变量始终保持在内存中 ,在此我用一些实际代码对这句话作进一步的 ...

  2. 深入理解javascript的闭包

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

  3. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  4. JavaScript闭包函数的理解与使用

    要理解闭包,首先理解javascript特殊的变量作用域,变量的作用域无非就是两种: 全局变量 局部变量 javascript语言的特殊处就是函数内部可以读取全局变量. 1.如何从外部读取局部变量 我 ...

  5. mysql闭包的概念_彻底搞懂JavaScript的闭包、防抖跟节流

    最近出去面试了一下,收获颇多!!! 以前的我,追求实际,比较追求实用价值,然而最近面试,传说中的面试造火箭,工作拧螺丝,竟然被我遇到了.虽然很多知识点在实际工作中并不经常用到,但人家就是靠这个来筛选人 ...

  6. Javascript的闭包及其使用技巧实例

    Javascript的闭包及其使用技巧实例 一.闭包的基本概念 闭包(Closure)是一个引用了自由变量的函数,记录了该函数在定义时的scope chain.又称词法闭包(Lexical Closu ...

  7. JavaScript中闭包实现的私有属性的getter()和setter()方法

    注意: 以下的输出都在浏览器的控制台中 <!DOCTYPE html> <html> <head><meta charset="utf-8" ...

  8. JavaScript:闭包

    在说JavaScript中闭包概念之前,我们先来了解一下作用域和变量生命周期的问题.作用域在前面的博客中有提到,大家可以点击查看一下,关于变量的生命周期,什么是生命周期?也就是变量从创建到销毁的一个过 ...

  9. JavaScript、Servlet、JSP理解

    JavaScript.Servlet.JSP理解 一.JavaScript(JS): JavaScript是一种小型的.轻量级的.面向对象的.跨平台的脚本语言,用于控制页面内容,实现网页浏览者与网页内 ...

  10. javascript之闭包深入理解(一)

    曾经在开始学习javascript的时候,很是不理解闭包的概念.今天想对它详细的剖析. 在说清楚闭包之前,必须先清楚作用域链. 作用域链 我们知道,执行环境是js中最为重要的一个概念.执行环境定义了变 ...

最新文章

  1. P3879 [TJOI2010]阅读理解 [STL]
  2. mysql5.6.7多实例安装、配置的详细讲解分析及shell启动脚本的编写
  3. java 中美时间_求教用java编写一个程序要求给定一个日期值,计算若干天后的日期值,和给定两个日期计算它们之间相距的天...
  4. SAP Spartacus的Lock Focus Directive单元测试实现
  5. 如何分析IBASE对应的icon无法正常显示的问题
  6. ionic2 安装与cordova打包
  7. modelsim仿真ROM IP数据输出为0的解决办法
  8. 怎么在安卓手机上阅读txt小说,小说阅读器推荐
  9. 如何下载自己喜欢的网站
  10. js 验证联系方式 手机号码及座机号码
  11. 为你的整轨APE音乐制作CUE文件(图文)
  12. 路由器做二级路由方法
  13. [附源码]Python计算机毕业设计Django的小区宠物管理系统
  14. 开山斧 WEBSHELL管理器 V0.2
  15. 第二章 马尔可夫决策过程及表格型方法
  16. 获得除当前元素外的所有其他元素,并对其他元素进行设置
  17. Spring注解@profile的使用
  18. WLAN, WPAN 和 WMAN技术的对比
  19. 用js 在页面上,设置多个按钮,点击当前按钮时,当前按钮文字变为“哈哈”,其他未点击的按钮文字变为“呜呜”。
  20. ML—广义线性模型导论

热门文章

  1. Ubuntu 12.04下安装OpenCV 2.3.1,图像二值化
  2. 从Slice_Header学习H.264(三.2)--相关细节之 参考图像列表
  3. 用glew,glfw,FreeImage实现opengl学习笔记6坐标变换
  4. Java Byte数组与Long的相互转化
  5. azkaban 入门简介
  6. python 浮点数精确运算解决方案
  7. awk去除行首行尾空格
  8. Markdown中显示代码段的语法特殊字符`如何输入?
  9. MYSQL连接出现Auth_连接MySQL数据库出现时Authentication plugin 'caching_sha2_password' cannot be loaded的解决办法...
  10. 安装python包管理系统_什么时候安装外部python包全局,什么时候本地?pip还是系统包管理器?...