4

我一直在阅读 Stoyan Stefanov 的《面向对象的 Javascript》一书。我看到这句话:

function 实际上是一个使用“Function”构造函数(大写 F)构建的对象。

作者用一些很好的例子证明了这一点。但是,基于该陈述,我得到了这个自己无法回答的问题。由于 'Function' 构造函数是一个函数,所以 'Function'函数是一个Object,那么 'Function'对象需要另一个构造函数来构建它,而另一个构造函数又是一个 Object (因为它是一个函数)。

好吧,我最终得到了这个无穷无尽的逻辑。有人可以帮我指出我思考的错误点吗?

4

2 回答 2

4

'Function' 函数是一个对象,那么 'Function' 对象需要另一个构造函数来构建它

No.Function是一个原生的内置对象,其属性和行为在EcmaScript 规范的第 15.3 节中定义。它不是由 js 函数构建的。

可以这样想:在您的 EcmaScript 环境的代码中某处构建函数对象的函数 - 每当您的脚本遇到函数表达式或声明时都会调用它。全局Function函数是该函数的包装器,以使其可供脚本访问。该函数返回的所有函数对象都继承自该Function.prototype对象 - 看起来它们是由Function. Function.prototype.constructor所有函数继承的属性也被定义为指向Function.

于 2012-10-14T14:23:53.920 回答
1

JS 中的函数嵌入了 2 个概念:

  1. 实体
  2. 一个功能

功能实体是某种包含功能的“胶囊”,即将多个输入转换为输出的能力。这个胶囊就是我们所说的“物体”。在此递归结束时,您会找到 identity Function.constructor === Function,它设置了语言内省特征的限制。其余的 JS 功能无法由语言本身访问,因为不存在任何嵌入它们的封装或对象。

在 JS 中,您不能定义独立的“功能”,但您可以创建实现此类功能的对象,这些功能可以被视为任何其他对象。Function对象是实现功能的核心对象。如果您定义命名或匿名函数(通过function关键字),您正在创建一个绑定到名称(对于命名函数)或直接绑定到变量(未命名函数)的 Function 对象。

function foo(a, b) { return a+b; } //This function is a Function object bound to the name `foo`

var a = function(a, b) { return a+b; } //the Function object is bound to `a`

与 Array 对象具有[]用于访问数组元素的运算符相同的方式,您可以将其解释()为用于调用其嵌入功能的 Function 对象的运算符。

于 2012-10-14T11:28:40.377 回答