javascript中闭包概念与用法深入理解


Posted in Javascript onDecember 15, 2016

本文实例分析了javascript中闭包概念与用法。分享给大家供大家参考,具体如下:

1.问题的引出,什么时候会遇到闭包?

首先因为JS是没有块状作用域的,但是有函数作用域即函数作为了局部变量之间的界限,不同函数内的局部变量具有独立性,

因为JS没有块状作用域,笔者初学JS时,在事件的监听时,因为不理解JS中局部变量的作用域,犯过不少错误!

(1)JS中的变量作用域

for(var i=0;i<9;i++)
{
}
alert(i) //输出9

我们发现,虽然变量i是块状区域for()内的一个局部变量,但是我们在块级作用域for()外,依然可以得到变量i

(2)JS中的函数作用域

function abc(){
 var a=1;
}
abc();
alert(a);// 会报错,a is not defined

我们发现,在函数外调用函数后,在函数外是无法取到函数里的变量

总结:通过(1),(2),我们加深了对JS中,没有块级作用域只有函数作用域的理解!

举例:如果现在例1:

var a=1
function abc(){
 var a=2;
}
abc();
alert(a) // a=1

特别注意如果例2:

var a=1
function abc(){
a=2;
alert(a);
}
abc();//a=2

对比例1,不同之处在于例2,中 是“a=2"而不是”var a=2“

区别在于如果是var a,则表示在函数中定义变量a,如果是没有变量声明,如果直接a,则表示在全局变量中定义变量a;

2.如果引用函数内部的变量?

由1可知,JS中只存在函数作用域,那么我们如何才能在拿到函数中定义的变量呢?

根据JS的语法规则:内部函数(或者内部对象)中,可以访问外部函数中的变量。

什么意思呢?举例说明例1:

function abc(){
 var a=1;
 !function(){
 alert(a)
} ()
} //此时不会报错,a=1

再举一个例子(内部对象的例子)例2:

var o={
 a=1,
 myfun:function(){
 return this.a
}
}

则alert(o.myfun())得到的值为1,现在我们大概了解了如何访问函数(或者对象,其实函数的本身也是对象)中的变量!

3.什么是闭包?

我的理解就定义在一个函数内部的函数!

闭包是函数内部与外部之间的桥梁!

即内部函数在定义它的外部使用时,就创建了一个闭包!

我们知道,一般情况下,当函数被调用完,内存会被释放,但是应用于函数闭包比如

function abc1(){
 var a=1;
function abc2(){
 a++;
}
return abc2()
}

当我们调用abc1()函数后,因为abc1函数的中又调用了abc2()函数,因此函数abc1()中的变量在子函数中被调用,所以在父函数abc1()调用结束后

变量a的内存空间并不会被释放!

为什么GC机制无法回收abc1()函数中的变量a,  因为首先我们在全局中调用了函数abc1(),我们设全局对象为c,abc1()对象为b,同时我们在对象b

即函数abc1()中又调用了函数abc2(),设abc2(0为a。

再次理解这种关系    c中调用了b,b中又调用了a,JS中规定当a,b对象两两互相引用,并且a,b中又有一个被a,b函数之外的对象c引用时,GC机制不执行垃圾回收(变量清空)!

由此我们引出了闭包的重要作用:

如果内部函数在其外部被调用,则会产生闭包,闭包用于保存某些变量的值,不会被垃圾回收机制回收!

4.闭包的缺点

因为使用闭包后,某些变量会在函数调用之后持续的保持在内存中,因此滥用闭包会导致内存泄漏!

5.扩展应用,加深对于闭包的理解!

var o={
 a:1;
myfunc:function(){
return function(){
 return this.a;
}
}
alert(o.myfunc()()); // a is not defined
}

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
js保留两位小数使用toFixed实现
Jul 29 Javascript
js判断两个日期是否相等的方法
Sep 10 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
Nov 26 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
Nov 02 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
JavaScript生成的动态下雨背景效果实现方法
Feb 25 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
Oct 31 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
vue-cli3配置与跨域处理方法
Aug 17 Javascript
JavaScript undefined及null区别实例解析
Jul 21 Javascript
javascript读取文本节点方法小结
Dec 15 #Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 #Javascript
jQuery validate插件功能与用法详解
Dec 15 #Javascript
EditPlus 正则表达式 实战(3)
Dec 15 #Javascript
js实现点击每个li节点,都弹出其文本值及修改
Dec 15 #Javascript
EditPlus中的正则表达式 实战(2)
Dec 15 #Javascript
js代码实现下拉菜单【推荐】
Dec 15 #Javascript
You might like
PHP导出带样式的Excel示例代码
2016/08/28 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
python WindowsError的错误代码详解
2017/07/23 Python
快速查询Python文档方法分享
2017/12/27 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python异常处理知识点总结
2019/02/18 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
django API 中接口的互相调用实例
2020/04/01 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
网上蛋糕店创业计划书
2014/01/24 职场文书
入学申请自荐信范文
2014/02/26 职场文书
工作检讨书500字
2014/10/19 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
化验室岗位职责
2015/02/14 职场文书
农业项目合作意向书
2015/05/08 职场文书
安全生产警示教育活动总结
2015/05/09 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
这样写python注释让代码更加的优雅
2021/06/02 Python
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python