据说“几乎所有东西都是一个物体”,包括功能。
那么,当我做类似的事情时,记忆中究竟发生了什么:
function func(){
// do something
}
var f = func;
f()
在我看来,它首先为'function func'创建一个对象实例,然后克隆(深拷贝,我猜)'function func'并将其分配给容器'var f'。
是吗?
或者,它是如何工作的?
谢谢!
答案 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,但同样,我们实际上从未看到过这些值)。