当前位置: 首页 > 知识库问答 >
问题:

javascript - js函数是存放在堆内存的么?

章松
2023-06-06

按照下面这张图例的解释,函数名是存放在栈内存的,函数体是存放在堆内存的,栈内存的value存放的是堆内存的地址,

image.png

那么, 下面这个代码控制台为什么打印了四次,分别输出 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()

共有2个答案

慕宪
2023-06-06

为什么还会执行?

  1. 跟垃圾回收没关系。简单来说,垃圾回收是释放“调用栈”上不可抵达内容之内存的占用;如果一个对象被执行环境认为是不可抵达的,不管他此刻是否被回收,他都不会对程序造成什么影响。

所以,my.init 指向 null 后,他此前指向的函数,依然被 init 所指,依然在“调用栈”上可抵达,所以该函数还会被执行。

  1. 理解这个问题,其实跟函数名放在栈内存和函数体放在堆内存关系不大,没有这个堆栈的认知也能理解它。而且,与其说函数名,不如说 js 在定义一个有名的函数时,会在当前的环境上创建一个同名变量指向该函数对象。
陆沈浪
2023-06-06

init 函数还在,所以不会被回收。

my.init 跟 init 是同一个函数,只有两个都消失了,才会回收。只清除掉 my.init 是不会回收的。

 类似资料:
  • 问题内容: 我只想从任何可能的字符串中创建一个正则表达式。 有内置的方法吗?如果没有,人们会使用什么?红宝石有。我觉得我不需要自己写东西,那里肯定有一些标准。谢谢! 问题答案: 上面链接的功能不足。它无法转义或(字符串的开头和结尾)或,这在字符组中用于范围。 使用此功能: 乍看起来似乎没有必要,但是转义(以及)使该函数适合于转义要插入字符类和正则表达式主体的字符。 转义使该函数适合转义要在JS正则

  • 问题内容: 运行时出现以下错误: 严重错误:CALL_AND_RETRY_LAST分配失败-JavaScript堆内存不足 有没有办法全局增加node.js内存限制? 问题答案: 您可以使用以下命令启动NPM: 如所描述的在这里,默认为4000(4GB)。

  • 安全上下文:000001af8a2cfb61 2:/*匿名*/[C:\project_folder\node_modules\source-map\lib\source-node.js:100][pc=0000016e99866533](this=00000346870554e1,mapping=000003c18fdc93c9)3:参数适配器框架:3->1 4:InnerArrayForEach

  • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?

  • 本文向大家介绍js的数组/对象在内存中分别是如何存储的?相关面试题,主要包含被问及js的数组/对象在内存中分别是如何存储的?时的应答技巧和注意事项,需要的朋友参考一下 JavaScript的对象是以一个描述ID、一个内容指针、以及跟随该对象的属性进行储存的。 当对象构造简单时,内容指针并不起作用,而所有属性直接跟在对象的内存地址之后。 比如对象,若其内存地址为0x1000,则该对象在内存中为 0x