84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
js的函数名既然是函数对象的一个指针,那么是引用的是内存吗?`
var a=function(c){ return ++c; } console.log(a(1)); var b=a; console.log(b(1)); var a=null; console.log(b); console.log(b(1));
` ,那么如何做手动销毁呢?全局变量是不是需要关闭浏览器才会回收?求解谢谢
首先var a会在stack里面开一块空间,然后你将他赋给一个function,是一个引用类型,于是又在heap里面又申请一块空间存放function,此时,stack里面的a存放的是function的地址
var a
stack
function
heap
a
而下面,将b赋值给a,是将stack里面a指向的heap里面function的地址赋给b,所以这就是为什么后来a指向了null,但是b仍然指向之前heap里面function的原因。
b
null
如何销毁?将b也设置为null或者其他值就好了。所以这种变量尽量不要写全局的,写局部变量。
是不是引用内存? 这问题有点太宽了, 数据都是放在内存里的, 自然需要引用内存但又不止引用内存那么简单, 内存只负责存数据, 数据间的关系是没法体现的, 所以不是直接引用内存中间是有隐藏处理的, 怎么操作有基本的理论, 但实际上很少人知道具体的细节, 太底层了
另外, 回收的话有两种做法:
1, 设置null, 等待自动清空 a = null; 会在回收程序执行的时候自动清空
2, 立刻清空 delete a; 直接执行回收 但老ie并不支持这种操作
一般直接用方法1就行, 不必担心会溢出, 自动回收会有多种触发, 比如定时, 比如数据达到一定量
雷雷
js用delete可以手动回收变量
关于垃圾回收机制:在IE旧版本下,DOM是COM对象的形式,采用引用次数计数清除,如果有循环引用的情况,那么就一直都不会得到释放内存的机会。在标准浏览器中是标记清除的方法,只需要手动解除将引用设置为null就可以释放内存了。
如果没有解除引用,那么会到离开执行环境时才释放内存,而全局的变量对象也就得等到全局执行环境退出时才会释放这部分的内存,即关闭浏览器时才会释放。
首先
var a
会在stack
里面开一块空间,然后你将他赋给一个function
,是一个引用类型,于是又在heap
里面又申请一块空间存放function
,此时,stack
里面的a
存放的是function
的地址而下面,将
b
赋值给a
,是将stack
里面a
指向的heap
里面function
的地址赋给b
,所以这就是为什么后来a
指向了null
,但是b
仍然指向之前heap
里面function
的原因。如何销毁?将
b
也设置为null
或者其他值就好了。所以这种变量尽量不要写全局的,写局部变量。是不是引用内存? 这问题有点太宽了, 数据都是放在内存里的, 自然需要引用内存
但又不止引用内存那么简单, 内存只负责存数据, 数据间的关系是没法体现的, 所以不是直接引用内存
中间是有隐藏处理的, 怎么操作有基本的理论, 但实际上很少人知道具体的细节, 太底层了
另外, 回收的话有两种做法:
一般直接用方法1就行, 不必担心会溢出, 自动回收会有多种触发, 比如定时, 比如数据达到一定量
雷雷
js用delete可以手动回收变量
关于垃圾回收机制:
在IE旧版本下,DOM是COM对象的形式,采用引用次数计数清除,如果有循环引用的情况,那么就一直都不会得到释放内存的机会。
在标准浏览器中是标记清除的方法,只需要手动解除将引用设置为null就可以释放内存了。
如果没有解除引用,那么会到离开执行环境时才释放内存,而全局的变量对象也就得等到全局执行环境退出时才会释放这部分的内存,即关闭浏览器时才会释放。