JavaScript 闭包介绍
闭包是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 闭包介绍相关推荐
- [转载]深入理解JavaScript闭包(closure)
最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...
- [转]Javascript 闭包
[转]Javascript 闭包 简介 Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭 ...
- 深入理解JavaScript闭包(closure) 【收藏】
深入理解JavaScript闭包(closure) 原文地址:http://www.felixwoo.com/archives/247 Felix Woo 最近在网上查阅了不少Javascript闭 ...
- 深入理解Javascript闭包
收藏 最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开J ...
- javascript闭包_JavaScript闭包教程–带有JS闭包示例代码
javascript闭包 Closures – many of you JavaScript devs have probably heard this term before. When I sta ...
- javascript闭包_通过邮寄包裹解释JavaScript闭包
javascript闭包 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 通过邮寄包裹解释JavaScript闭包 (JavaScript Closures E ...
- 【转】深入理解JavaScript闭包(closure)
文章来源:http://www.felixwoo.com/archives/247 最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说 ...
- (转)深入理解Javascript闭包(closure)
深入理解Javascript闭包(closure) 一.什么是闭包? "官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境 ...
- 【javascript闭包】转载一篇不错的解释,也有几个大牛的链接
初学闭包时一直以为很简单.但伴随对一个问题深入学习后,才算真正理解了闭包,同时也发现连<<JavaScript高级程序设计>>中都些不准确的地方. 我不准备从头介绍闭包的概念, ...
最新文章
- MATLAB 求图像的极大值极小值,平均值
- Java入门1.2.3—一个老鸟的Java学习心得
- mysql排插问题_MySQL一次数据插入故障记录
- 辽宁412想学计算机科学技术,辽宁理工学院计算机科学与技术专业2016年在辽宁理科高考录取最低分数线...
- 每个 JavaScript 工程师都应懂的33个概念
- 解决VMware/virtualbox虚拟机下ghost安装XP后无法从硬盘启动的问题
- paip.提升安全性-------用户口令密码的检测与生成
- django商城项目之历史浏览记录
- 学会可视化大屏布局技巧,让领导都赞不绝口
- three.js 05-08 之 TorusKnotGeometry 几何体
- Camtasia如何给视频或者图片调色
- 数据分析可视化- 十三朝古都西安
- 黑龙江省扶贫电商平台“小康龙江”上线 传输绿色优质农产品
- 使用微PE安装U盘windows系统
- 【UVA11478】Halum (最短路解差分约束)
- 解决IE8/IE9无法加载Activex控件问题
- MySql视图原理讲解与使用大全
- Tita OKR实施攻略
- 【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】
- 多媒体计算机维修记载,多媒体个人工作总结
热门文章
- xgboost融合模型:大学助学金精准资助预测(有数据)
- 常见面试算法:决策树、随机森林和AdaBoost
- php mvc vue 调用js函数_js 匿名函数自调用
- visual foxpro 程序员指南_1024程序员节:盘点小红书今年发生的重要bug
- 微型计算机系统中 麦克风属于,模块1-2 计算机基础知识测验题目(50小题)
- adb命令重置_android – 擦除数据/通过ADB恢复出厂设置
- Eclipse用法和技巧十四:自动生成的TODO注释2
- 设计模式原则之二:开闭原则
- Android Studio 解决 Cannot resolve symbol xxx 添加依赖后出现飘红
- Qt--音乐播放器 V2.0_vortex_新浪博客