一、闭包

实现可重用的局部变量,且保护其不受污染的机制。

  1. 外层函数包裹受保护的变量和内层函数。
  2. 内层函数专门负责操作外层函数的局部变量。
  3. 将内层函数返回到外层函数外部,反复调用。

二、作用域

子函数会一级一级地向上寻找所有父函数的变量。所以,父函数的所有变量,对子函数都是可见的,反之则不成立。

三、函数调用

  1. 外层函数调用了几次,就有几个受保护的局部变量副本。
  2. 同一次外层函数调用返回的多个内层函数,共同用一个局部变量。
  3. 闭包的局部变量不能释放。
  4. 尽量不要在定时器中使用闭包。因为闭包的外层函数定义的变量不能释放,但是定时器使用中需要释放。

四、内层函数使用不同变量的实例详解

1、内层函数使用自己的变量

内层函数使用自己的变量,调用完后,直接释放。

function outerFun(){
function innerFun(){
var innerVar = ;
      innerVar++;
alert(innerVar);
}
return innerFun;
}
var globVar1 = outerFun();
globVar1(); // Alert 1
globVar1(); // Alert 1
var innerVar2 = outerFun();
innerVar2(); // Alert 1
innerVar2(); // Alert 1

2、内层函数使用全局变量

全局变量释放,是在所有代码运行完成后。

var globVar = ;
function outerFun(){
function innerFun(){
globVar++;
alert(globVar);
}
return innerFun;
}
var globVar1 = outerFun();
globVar1();  // Alert 1
globVar1();  // Alert 2
var globVar2 = outerFun();
globVar2();  // Alert 3
globVar2();  // Alert 4

3、内层函数使用外层函数变量(闭包)

  • 外层函数调用几次就有几个被保护的局部变量副本。
  • 闭包的局部变量不被释放。
function outerFun(){
var outerVar = ;
function innerFun(){
outerVar++;
alert(outerVar);
     }
return innerFun;
}
var globVar = outerFun();
globVar();  // Alert 1
globVar();  // Alert 2
var globVar2 = outerFun();
globVar2();  // Alert 1
globVar2();  // Alert 2

js 闭包的用法详解的更多相关文章

  1. js闭包的用途详解

    js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中 我们来看看闭包的用途.事实上,通过使用闭包,我们可以做很多事情.比如模拟 ...

  2. js中reduce用法详解

    介绍reduce reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当 ...

  3. js replace 与replaceall实例用法详解

    这篇文章介绍了js replace 与replaceall实例用法详解,有需要的朋友可以参考一下stringObj.replace(rgExp, replaceText) 参数 stringObj 必 ...

  4. js数组中foEach和map的用法详解 jq中的$.each和$.map

    数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...

  5. JS逗号运算符的用法详解

    逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...

  6. js原生之scrollTop、offsetHeight和offsetTop等属性用法详解

    scrollTop.offsetHeight和offsetTop等属性用法详解:标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼容 ...

  7. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  8. window.onload用法详解:

    网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的底端,这样在运行脚本代 ...

  9. 【Ext.Net学习笔记】03:Ext.Net DirectEvents用法详解、DirectMethods用法详解

    Ext.Net通过DirectEvents进行服务器端异步的事件处理.[Ext.Net学习笔记]02:Ext.Net用法概览.Ext.Net MessageBus用法.Ext.Net布局 中已经简单的 ...

随机推荐

  1. java学习笔记IO之File类

    File类总结 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Times } p.p2 { margin: 0.0px 0.0px 0.0p ...

  2. SSI学习(二)

    1.SSI指令 #config:指定返回到client浏览器的错误消息.日期和文件大小所使用的格式. #echo:在 HTML 页中插入环境变量的值. #exec:执行一个应用程序或一条 shell ...

  3. 【VS2017新特性】在VS中调试javascript脚本

    1   概述 VS2017可以调试JS,本篇文章简要概述VS2017关于启用和关闭VS调试功能. 2   具体内容 当开启VS2017JS调试功能时,我们用VS2017打开解决方案时,会出现如下界面: ...

  4. C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

    在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基 ...

  5. 面向矩阵的numpy入门笔记

    我先声明我学numpy的目的:在python中使用矩阵(我需要在机器学习中使用矩阵),所以我的目的很明确,矩阵: 矩阵在numpy中叫ndarray(The N-dimensional array), ...

  6. spring mvc对静态资源的访问

    如果我们的项目使用的是springmvc,在web.xml中会有一段这的配置. <servlet> <servlet-name>springMvc</servlet-na ...

  7. spring+hibernate项目demo搭建

    之前用maven+spring+mybatis+spring mvc搭建了一个web项目,用于学习spring及相关知识,现在打算将mybatis换成hibernate,一样搭建一个框架. 其实myb ...

  8. mybatis分页练手

    最近碰到个需求,要做个透明的mybatis分页功能,描述如下:目标:搜索列表的Controller action要和原先保持一样,并且返回的json需要有分页信息,如: @ResponseBody @ ...

  9. django的CMS系统(内容管理系统)

    一.什么是CMS系统 CMS具有许多基于模板的优秀设计,可以减少开发的成本. CMS的功能并不只限于文本处理,它也可以处理图片.Flash动画.声像流.图像甚至电子邮件档案. CMS还分各个平台脚本种 ...

  10. CS:APP3e 深入理解计算机系统_3e Attacklab 实验

    详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...