详解javascript中的闭包
| 全局变量与局部变量 | 
在说闭包之前先说明全局变量与局部变量
- 全局变量:变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。
- 局部变量:使用var关键字定义
全局变量/局部变量的作用域:
全局变量作用于整个程序,任何一处代码都能访问,局部变量只能用于定义它函数内部。对于其他的函数或脚本代码是不可用的。
全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值。
第二需要知道的预备知识:javascript的作用域,请参考博客javascript基础
| 变量的生命周期 | 
全局变量的作用域是全局性的,即在整个JavaScript程序中,全局变量处处都在。
而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用,函数一旦执行完毕,局部变量将释放。
先看示例:计数器问题
function add() {
    var counter = 0;
    counter += 1;
}
add();
add();
add();
// 本意是想输出 3, 但事与愿违,输出的都是 1 !
当我们把局部变量在换成全局变量在看计数器问题
counter=0;
function add() {
counter+=1;
console.log(counter); }
add();
add();
add();//最后结果输出3,本次结果虽然符合我们的要求,但是修改全局变量对于我们程序是不友好的,因为可能在任何一处都可能使用到该全局变量
| 闭包的引入与示例 | 
从javascript的作用域我们知道,函数的嵌套可以使得内部函数可以访问到上一层函数的变量,这样我们就可以利用函数的嵌套解决计数器问题。
示例:
function add() {
    var counter=0;
    function innerAdd() {
        counter+=1;
    }
    innerAdd();
    return counter
}
add();
add();
res=add();
console.log(res)
//输出1.,这是因为每次调用add函数时候都把counter进行了重新赋值为0了,如果我们让counter=0只执行一次,那么问题就得到解决了。
| javascript的闭包 | 
在javascript中有一类函数是自执行函数,这里我们我们将用它来解决计数器问题;
示例:
var add=(function() {
    var counter=0;
    return function () {
        counter+=1;
        console.log(counter )
    }
})()
add();
add();
add();
//输出counter值为3
示例解析:
- 变量 add 指定了函数自我调用的返回字值;
- 自我调用函数只执行一次。设置计数器为 0。并返回函数表达式;
- add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器;
- 这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能;
- 计数器受匿名函数的作用域保护,只能通过 add 方法修改;
- 闭包是可访问上一层函数作用域里变量的函数,即便上一层函数已经关闭。
总结:
闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会增加内存消耗。
或者说闭包就是子函数可以使用父函数的局部变量,还有父函数的参数。
详解javascript中的闭包的更多相关文章
- 详解javascript中的this对象
		详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ... 
- 【转】详解JavaScript中的this
		ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ... 
- 详解 javascript中offsetleft属性的用法(转)
		详解 javascript中offsetleft属性的用法 转载 2015-11-11 投稿:mrr 我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ... 
- (转载)详解Javascript中prototype属性(推荐)
		在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ... 
- 详解JavaScript中的原型
		前言 原型.原型链应该是被大多数前端er说烂的词,但是应该还有很多人不能完整的解释这两个内容,当然也包括我自己. 最早一篇原型链文章写于2019年07月,那个时候也是费了老大劲才理解到了七八成,到现在 ... 
- 详解js中的闭包
		前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ... 
- 【转】详解JavaScript中的异常处理方法
		有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个 ... 
- 详解JavaScript中的Event Loop(事件循环)机制
		前言 我们都知道,javascript从诞生之日起就是一门单线程的非阻塞的脚本语言.这是由其最初的用途来决定的:与浏览器交互. 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程 ... 
- 详解JavaScript中的arc的方法
		今天说说JavaScript在网页中画圆的函数arc! 一.arc所需要的参数设置 1 arc(x, y, radius, startAngle, endAngle, counterclockwise ... 
随机推荐
- Kill 进程
			动态杀各种进程,谨慎操作:事例 status='sleeping' --AUTHOR KiNg --DATE 2016-05-30 DECLARE @SPID INT ... 
- 面试经验And总结
			作为一个实习生,我大二即将读完,因为自己是大专的和本科没法比,没有他们的 知识基础,没有他们的充裕的时间,没有那个本科毕业证,没有学位证书.作为一个大专生我在找工作的时候总是充满了自卑,可自己有事那种 ... 
- [SharePoint Online]SharePoint Designer无法打开世纪互联版sp online站点得解决方法,报错信息:请安装更新后再重新打开
			现象描述: 装了个x64版SharePoint designer 2013, 没有装SP1,在打开国际版得office 365 online得时候完全没有问题,但是在打开世纪互联版得时候就打不开,让安 ... 
- 极光配置-》thinkphp3.2.3
			1,小白我搞了几天,终于得到了这样的结果(我猜应该是成功了吧). { "body": { "sendno": "100000", " ... 
- java.lang.Exception: 资源处理失败,失败原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '?????‰' in 'where clause'
			1:Unknown column '?????‰' in 'where clause',这个问题,百度一搜,挺多的,但是貌似好像没有解决我的问题.贴一下我是如何拼接sql的.解决这个sql拼接bug的 ... 
- Mac appium.dmg.  Xcode Command Line Tools
			You need to install the command line tools as marked in your message: ✖ Xcode Command Line Tools are ... 
- c# 岛2 小辅助~~~ 钓鱼 连击
- php的二维数组排序
			//建立一个$arr的二维数组 $arr=array( array('name'=>'e','age'=>5), array('name'=>'b','age'=>2), ar ... 
- 浮动(float)与清除浮动(clear)
			上一篇中我们了解了块级元素与内联元素,今天将自己查阅的资料整理写出来,与大家一起理解什么是浮动,以及怎样清除浮动,本文以div元素为例. 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮 ... 
- js 移动端上拉加载下一页通用方案
			取页面三种高度 //取进度条到底部距离 var getScrollTop = function () { var scrollTop = 0; if (document.documentElement ... 
