javascript 通过引用和记忆

javascript by reference and memory

伙计们,我正在尝试学习一些东西 javascript,我有一个我认为很重要的问题要问。 所以到目前为止我得到的是当我做这样的事情时:

var a=function(){} 

在创建阶段会在内存中创建一个具有未定义值的变量(a),在执行过程中a会指向函数所在的内存槽。

所以 a 指向的旧点(具有未定义值的那个)发生了什么?另外,如果我将 b 设置为 a,这意味着它们将指向同一个内存插槽,对吗?

b 之前指向的插槽发生了什么?

函数最终是否在创建阶段被保存到内存中但无法调用,因为没有指向它或它只是在执行阶段被保存?

谢谢,我希望你能帮助我理清思路(这些问题让我无法入睡:D)

我想我明白你想问什么了。当你在 JavaScript 中有一个变量,或者任何有自己的垃圾收集器的编程语言,并且你正在引用内存中的一个部分......例如让我们说 变量 A = 50; 变量 B = 75;

并且你想转身重新赋值 A = B;

内存位置将被释放,A 现在为 75。

这里有一些文档可以更详细地解释: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

var a=function(){}

这不会创建指向未定义的指针,然后将其重新指向函数。它直接指向函数。

即使你做了

var a;
a = function(){};

a 不指向未定义的随机内存位置。 A 未定义。未定义是一个值。然后你给它分配一个指向函数的引用。 undefined不需要清除,因为它被替换了。

此外,基值是复制的,而不是引用的,所以:

A = 50; var B = 75; A = B;

不使用 3 个内存位置,只有 2 个,先保存 50 和 75,然后保存 75 和 75。

如果是对象,那就是引用。 当对象未被引用时发生的事情是它们被垃圾收集器删除,这是一个释放不再被任何人引用的对象的内存的例程。

所以 a 指向的旧点(未定义值)发生了什么?

我不知道任何 JavaScript 引擎的确切细节,但我怀疑真的没有这样的插槽。相反,undefined 可能只是一个特殊值,它被放入 a 中,表示它不指向任何地方(类似于 C 中的 NULL )。

如果undefined真的有一个内存槽,它是所有未定义变量指向的单个对象。它没有任何反应,因为还有很多其他变量指向它。

另外,如果我将 b 设置为等于 a,这意味着它们将指向相同的内存插槽,对吗?

是的。当您在 JavaScript 中分配变量时,它只是复制引用。

b 之前指向的插槽发生了什么?

如果还有其他任何东西指向它,那就什么也没有。如果没有别的东西指向它,垃圾收集器最终会回收它的内存。

函数最终是否在创建阶段被保存到内存但无法调用,因为没有指向它或它只是在执行阶段被保存?

创建时保存。可以在不将函数分配给变量的情况下创建一个函数——这是一个常见的习惯用法,称为 Immediately Invoked Function Expression:

(function() { console.log("Function is running"); })();

此函数已创建、被调用,然后变得不可访问。垃圾收集器最终会回收它。