闭包是JS学习过程中的难点之一,本文主要介绍一下对闭包的认识。

  • JS中变量的作用域;

要理解闭包,先要理解JS中变量的作用域,变量作用域有两种:局部变量和全局变量,JS特殊之处在于,函数内部可以直接读取全局变量。

var name="global";function foo()
{alert(name);
}foo();

反之,从外部访问函数的局部变量则不行

function foo()
{var fun_name = "foo";    // 这里需要注意的是,变量的定位之前如果不加上var的话,fun_name会被作为全局变量对待
}foo();fun_name; // undefined

  • 如何从外部读取局部变量;

上面已经介绍过,正常情况下是无法从函数的外部获取到函数内部变量的值的,但是有些情况下这种需求又确实存在,所以需要做一下变通,具体的变通方式请看下面的例子:

function foo()
{a=100;return function() {return a;}
}
bar=foo();
bar();

  • 闭包的概念;

上面的例子中,函数 foo 内部的匿名函数就是闭包,简单来说,能够读取其他函数内部变量的函数就是闭包,由于在JS中, 只有其他函数内部的子函数才能读取到函数的局部变量,所以可以认为闭包就是子函数。

  • 使用闭包的注意点;

使用必要有两个地方要注意:

1. 闭包会导致函数调用完成后,局部变量仍然不被垃圾回收机制回收,所以可能会导致内存溢出,最好的方法是在变量使用完成后,手动清空不在需要的变量,比如 bar=null;

2. 由于子函数内部可以操作外部函数的局部变量,这个地方要特别注意不要误操作;

  • 思考题;

对比一下两段代码的输出,有助于理解闭包:

var name = "The Window";var object = {name : "My Object",getNameFunc : function(){return function(){return this.name;};}};alert(object.getNameFunc()());这断代码中,由于子匿名函数内部并没有定义this指针,所以沿着作用域链向上会找到全局的this指针,全局的this指针对应的name变量的值就是"The Window"

  var name = "The Window";var object = {name : "My Object",getNameFunc : function(){var that = this;return function(){return that.name;};}};alert(object.getNameFunc()());这段代码中,子匿名函数中没有定位that变量,沿着作用域链向上找,找到 getNameFunc 函数,这个函数中定义了 that 变量,that变量的值为指向 object 对象的指针,所以此时 that.name 返回object 对象的name属性。

参考资料:

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

转载于:https://www.cnblogs.com/cbffr/p/5013245.html

JavaScript 闭包介绍相关推荐

  1. [转载]深入理解JavaScript闭包(closure)

    最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  2. [转]Javascript 闭包

    [转]Javascript 闭包 简介 Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭 ...

  3. 深入理解JavaScript闭包(closure) 【收藏】

    深入理解JavaScript闭包(closure) 原文地址:http://www.felixwoo.com/archives/247  Felix Woo 最近在网上查阅了不少Javascript闭 ...

  4. 深入理解Javascript闭包

    收藏 最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开J ...

  5. javascript闭包_JavaScript闭包教程–带有JS闭包示例代码

    javascript闭包 Closures – many of you JavaScript devs have probably heard this term before. When I sta ...

  6. javascript闭包_通过邮寄包裹解释JavaScript闭包

    javascript闭包 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 通过邮寄包裹解释JavaScript闭包 (JavaScript Closures E ...

  7. 【转】深入理解JavaScript闭包(closure)

    文章来源:http://www.felixwoo.com/archives/247 最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说 ...

  8. (转)深入理解Javascript闭包(closure)

    深入理解Javascript闭包(closure) 一.什么是闭包?        "官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境 ...

  9. 【javascript闭包】转载一篇不错的解释,也有几个大牛的链接

    初学闭包时一直以为很简单.但伴随对一个问题深入学习后,才算真正理解了闭包,同时也发现连<<JavaScript高级程序设计>>中都些不准确的地方. 我不准备从头介绍闭包的概念, ...

最新文章

  1. MATLAB 求图像的极大值极小值,平均值
  2. Java入门1.2.3—一个老鸟的Java学习心得
  3. mysql排插问题_MySQL一次数据插入故障记录
  4. 辽宁412想学计算机科学技术,辽宁理工学院计算机科学与技术专业2016年在辽宁理科高考录取最低分数线...
  5. 每个 JavaScript 工程师都应懂的33个概念
  6. 解决VMware/virtualbox虚拟机下ghost安装XP后无法从硬盘启动的问题
  7. paip.提升安全性-------用户口令密码的检测与生成
  8. django商城项目之历史浏览记录
  9. 学会可视化大屏布局技巧,让领导都赞不绝口
  10. three.js 05-08 之 TorusKnotGeometry 几何体
  11. Camtasia如何给视频或者图片调色
  12. 数据分析可视化- 十三朝古都西安
  13. 黑龙江省扶贫电商平台“小康龙江”上线 传输绿色优质农产品
  14. 使用微PE安装U盘windows系统
  15. 【UVA11478】Halum (最短路解差分约束)
  16. 解决IE8/IE9无法加载Activex控件问题
  17. MySql视图原理讲解与使用大全
  18. Tita OKR实施攻略
  19. 【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】
  20. 多媒体计算机维修记载,多媒体个人工作总结

热门文章

  1. xgboost融合模型:大学助学金精准资助预测(有数据)
  2. 常见面试算法:决策树、随机森林和AdaBoost
  3. php mvc vue 调用js函数_js 匿名函数自调用
  4. visual foxpro 程序员指南_1024程序员节:盘点小红书今年发生的重要bug
  5. 微型计算机系统中 麦克风属于,模块1-2 计算机基础知识测验题目(50小题)
  6. adb命令重置_android – 擦除数据/通过ADB恢复出厂设置
  7. Eclipse用法和技巧十四:自动生成的TODO注释2
  8. 设计模式原则之二:开闭原则
  9. Android Studio 解决 Cannot resolve symbol xxx 添加依赖后出现飘红
  10. Qt--音乐播放器 V2.0_vortex_新浪博客