js函数是存放在堆内存的么?
按照下面这张图例的解释,函数名是存放在栈内存的,函数体是存放在堆内存的,栈内存的value存放的是堆内存的地址,
那么, 下面这个代码控制台为什么打印了四次,分别输出 true false false fasle;
my.init 和 init应该指向同一个堆内存地址,栈内存的value 应该是相同的,当 my.init = null后,对应的堆内存应该被垃圾回收了,为什么还会执行四次呢
var my = {n:3};
my.init = function init(){
console.log( init === my.init);
if(my.n){
my.n--;
my.init = null;
init()
}
};
my.init()
回复
1个回答

test
2024-07-02
为什么还会执行?
- 跟垃圾回收没关系。简单来说,垃圾回收是释放“调用栈”上不可抵达内容之内存的占用;如果一个对象被执行环境认为是不可抵达的,不管他此刻是否被回收,他都不会对程序造成什么影响。
所以,my.init 指向 null 后,他此前指向的函数,依然被 init 所指,依然在“调用栈”上可抵达,所以该函数还会被执行。
- 理解这个问题,其实跟函数名放在栈内存和函数体放在堆内存关系不大,没有这个堆栈的认知也能理解它。而且,与其说函数名,不如说 js 在定义一个有名的函数时,会在当前的环境上创建一个同名变量指向该函数对象。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容