如果函数是对象,函数体去哪里了?

lam*_*kie 4 javascript

如果函数是对象,函数体去哪里了?

让我澄清一下我的困惑。函数是对象,好吧。我可以将对象视为由字符串键和任意类型的值组成的哈希映射。我可以做这个:

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方法的信息......

一些澄清将不胜感激!:)

Fel*_*ing 5

它成为另一个内部属性的值,称为[[Code]]

13.2 创建函数对象
给定一个由FormalParameterList指定的可选参数列表、一个由FunctionBody指定的主体、一个由Scope指定的词法环境和一个布尔标志Strict,一个 Function 对象构造如下:

[...]

  1. F[[Code]]内部属性设置为FunctionBody

如果是这样,执行如何工作?

调用函数基本上是调用内部[[Call]]方法,在http://es5.github.io/#x13.2.1中有描述。我想重要的一步是:

  1. result是对FunctionBody求值的结果,FunctionBodyF[[Code]]内部属性的值。

  • @baerenfaenger 查看[内部属性的定义](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6.2) 可能会有所帮助:“*...内部属性不是 ECMAScript 语言的一部分。本规范定义它们纯粹是出于说明目的。ECMAScript 的实现必须表现 ** 好像** 它以此处描述的方式生成和操作内部属性。*”(强调我的)我们所说的“内部属性”纯粹是概念上的;如何实现内部属性所需的行为完全取决于每个实现。 (2认同)