如果函数是对象,函数体去哪里了?
让我澄清一下我的困惑。函数是对象,好吧。我可以将对象视为由字符串键和任意类型的值组成的哈希映射。我可以做这个:
function Square(size) {
Rectangle.call(this, size, size);
}
Square.prototype = new Rectangle();
Run Code Online (Sandbox Code Playgroud)
我只是把它Square当作一个普通对象对待,并prototype通过为它分配一个新值来弄乱它的属性。但是,如果函数只是对象(或与此相关的哈希映射),那么函数的主体(在此示例中Rectangle.call(this, size, size);)存储在哪里?
我认为它必须存储为某些属性的值,可能如下所示:
console.log(Square.executableBody); // "Rectangle.call(this, size, size);"
Run Code Online (Sandbox Code Playgroud)
显然,情况并非如此。有趣的是,在阅读 Nicholas C. Zakas 的“面向对象的 JavaScript 原理”时,我偶然发现了这一点:
[...] 函数实际上是 JavaScript 中的对象。函数的定义特征——它与任何其他对象的区别——是存在一个名为 [[Call]] 的内部属性。内部属性无法通过代码访问 [...] [[Call]] 属性是函数独有的,表示可以执行对象。
这可能是我在上面寻找的属性。不过,它没有详细说明。函数的主体是否实际存储在[[Call]]属性中?如果是这样,执行如何工作?不幸的是我无法找到更多关于[[Call]],谷歌主要想出了关于函数call方法的信息......
一些澄清将不胜感激!:)
它成为另一个内部属性的值,称为[[Code]]:
13.2 创建函数对象
给定一个由FormalParameterList指定的可选参数列表、一个由FunctionBody指定的主体、一个由Scope指定的词法环境和一个布尔标志Strict,一个 Function 对象构造如下:[...]
- 将F的
[[Code]]内部属性设置为FunctionBody。
如果是这样,执行如何工作?
调用函数基本上是调用内部[[Call]]方法,在http://es5.github.io/#x13.2.1中有描述。我想重要的一步是:
- 令result是对FunctionBody求值的结果,FunctionBody是F的
[[Code]]内部属性的值。