JS函数对象如何存储在内存中?

时间:2016-08-13 10:57:49

标签: javascript

据说“几乎所有东西都是一个物体”,包括功能。

那么,当我做类似的事情时,记忆中究竟发生了什么:

function func(){
    // do something
}
var f = func;
f()


在我看来,它首先为'function func'创建一个对象实例,然后克隆(深拷贝,我猜)'function func'并将其分配给容器'var f'。

是吗?
或者,它是如何工作的? 谢谢!

1 个答案:

答案 0 :(得分:3)

  

在我看来,它首先为'function func'

创建一个对象实例

是的,就在它处理function func() { }部分

的时候
  

,然后克隆(深拷贝,我猜)'function func'并将其分配给容器'var f'。

不,一点也不。存储在f中的是一个称为“对象引用”的值(或者通常只是“引用”)。可以将其视为JavaScript引擎可用于在内存中的其他位置查找对象的数字。 (我们看不到实际值,但我们不需要。)

所以,当你的所有代码都已运行时,在完成任何垃圾收集之前,你就会在内存中找到它(遗漏了一些不必要的细节)

func:Ref89895−−−+
                |
                |      +−−−−−−−−−−−−−−−−−−−−+
                +−−−−−>| function           |
                |      +−−−−−−−−−−−−−−−−−−−−+
                |      | name: "func"       |
f:Ref89895−−−−−−+      | length: 0          |
                       | ...                |
                       +−−−−−−−−−−−−−−−−−−−−+

func,它是function func() { }在当前上下文中创建的自动绑定(挥手,基本上是变量)f变量你已经为其分配了一个值的副本(显示为Ref89895,但同样,我们实际上从未看到过这些值)。