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"); })();
此函数已创建、被调用,然后变得不可访问。垃圾收集器最终会回收它。
伙计们,我正在尝试学习一些东西 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"); })();
此函数已创建、被调用,然后变得不可访问。垃圾收集器最终会回收它。