文档章节

javascript对象---11 闭包

奋斗的小芋头
 奋斗的小芋头
发布于 2016/11/28 19:23
字数 565
阅读 28
收藏 2

一、目的

1.闭包(closure) : 闭包的目的是 读取 其他函数内部变量,由于正常函数执行后都会进行弹栈,从而不再保存临时变量,因此闭包 会使函数的临时变量永久的保存在内存中。

定义一个函数,函数内容执行过程,会把函数中变量放在堆内存,或栈内存中,一旦整个函数执行结束,栈内存弹出,堆内存等待垃圾回收,执行后无法访问临时变量,而闭包可以访问临时变量,

2.通过内部函数才能访问函数的变量,因此所有闭包的实现方式都是通过内部函数的方式实现。

目的:读取当前函数在执行过程中的临时变量的值

3.闭包会导致函数执行过程中内存不会释放,要注意使用场景与频繁程度。

 

获取函数临时变量的值

1. 用返回 return

<script>
            function fun(){
                var obj = {
                    name :"zhangsan"
                }
                return obj;
            }
            var a = fun();
            console.log(a);
</script>

2.  定义一个全局函数

function fun(){
                var obj = {
                    name :"zhangsan"
                };
                
        //此时inner相当于全局函数,相当于在window里面加了一个inner属性,
        //inner属性对应的值为 function, 返回当前临时变量obj
                inner = function (){ 
                    return obj;
                }
                
            }; //fun()
            //第一步要先调用 fun()
            fun();     //已经加载 全局函数 inner()到 window环境;
            var ob =inner();
            console.log(ob.name);

通过在函数体内设置一个 全局function 获取函数内临时变量的值---全局变量函数,对局部变量对象 obj进行了引用,js识别 obj 被占用-----就不会弹栈,所以每次执行inner时可以访问,------但造成obj不弹栈--不知道什么时候会调用,造成内存浪费

3.定义一个内部函数,并返回

function fun(){
				var obj = {
					name :"zhangsan"
				};
		
				
				//对于当前内部函数来说 ret有访问内部对象的权利
				function ret(){
					return obj;
				}
				return ret ; // ret没加()代表当前返回的是函数对象
				
			};
			
			
			var ret = fun();  //ret本身是一个函数
			var obj = ret();
			console.log(obj)

通过内部函数返回,ret()方法内访问obj对象,

var ret = fun();   //引用了 ret所以 ret 不会出栈
 var obj = ret();

 

 

 

© 著作权归作者所有

共有 人打赏支持
奋斗的小芋头
粉丝 1
博文 161
码字总数 129412
作品 0
大连
javascript深入理解js闭包

一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量...

Yamazaki
2012/06/15
0
0
JavaScript 语言基础知识点总结(思维导图)

(1)javascript 数组 (2)函数基础 (3)运算符 (4)流程语句 (5)正则表达式 (6)字符串函数 (7)数据类型 (8)变量 (9)window 对象 (10)DOM基本操作 (11)一图知晓整个Javascr...

大数据之路
2012/11/26
0
2
细说JavaScript数据类型及转换

细说JavaScript数据类型及转换 JavaScript数据类型 1.Boolean(布尔) 布尔:(值类型)var b1=true;//布尔类型 2.Number(数字) 数值:(值类型)var n1=3.1415926;//数值类型 n1.toFixed...

开元中国2015
2015/07/13
0
0
Javascript原型链和闭包深入解析

Javascript语法核心 Javascript目前可以说是Web前段开发标配脚本语言,相关标准已经发展到ES6,不过该标准并未得到大部分浏览器的支持,并且在该标准之前的很多项目都是基于ES5.x标准。文本所...

jackie8tao
08/11
0
0
JavaScript面试大全(二)

eval()是做什么的? [eval()是“魔鬼”][1] null,undefined 的区别? [来看看大神阮一峰的解释吧][2] 写一个通用的事件侦听器函数。 [JS事件监听器][3] Node.js的适用场景? [NodeJS优缺点及...

百变茄
2014/06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
10
0
vm GC 日志 配置及查看

-XX:+PrintGCDetails 打印 gc 日志 -XX:+PrintTenuringDistribution 监控晋升分布 -XX:+PrintGCTimeStamps 包含时间戳 -XX:+printGCDateStamps 包含时间 -Xloggc:<filename> 可以将数据保存为......

Canaan_
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部