鉴于以下代码,在内存中创建了多少复杂对象?
function Foo() {
this.one = function() {
return "one";
}
}
var f = new Foo();
Foo.two = function() {
return "two";
};
我的猜测:
Foo
构造函数对象f.__proto__
Foo
构造函数对象f
one
功能对象two
功能对象答案 0 :(得分:2)
这个问题很棘手,因为规范没有说明在内存中创建的对象。
JavaScript有很多不同的实现,例如Chrome中的v8,Safari中的JSC,Firefox中的SpiderMonkey,IE中的JScript和Chakra,Rhino作为Java中的脚本引擎等等。更不用说其他更深奥的实现了。
更糟糕的是,实现 指定了函数的VariableEnvironment
之类的东西,并提到它不是实现细节,而只是一个演绎工具,使规范更容易阅读。
鉴于上面的代码 - 一个“聪明”的引擎可以在这里分配零对象。
为什么呢?上面的代码根本没有副作用。你没有在任何地方调用Foo
或使用f
,而且它的'死代码'在某种意义上并没有真正使用过。
那就是说,忽略那个“微小”的问题 - 根据代码的使用方式,有一些事情:一个 - 可能会分配字符串"foo"
和"one"
(它们是原始的,但可能需要拳击取决于使用)。
或者,引擎可以完全inline这些功能。如果是,则one
和two
不会被分配,而是直接内联。
所以 - 这个问题真的无法准确回答:)