4

Stoyan Stefanov の「Object Oriented Javascript」という本を読んでいます。次の文が表示されます。

function は実際には、'Function' コンストラクター関数 (大文字の F) で構築されたオブジェクトです。

著者は、いくつかの素晴らしい例でこれを示しています。しかし、その発言に基づいて、私は自分では答えられないこの質問を受け取りました。「関数」コンストラクターは関数であるため、「関数」関数オブジェクトであるため、「関数」オブジェクトはそれを構築するために別のコンストラクター関数が必要であり、別のコンストラクター関数は再びオブジェクトです (関数であるため)

さて、私はこの無限の論理に行き着きます。誰かが私の考えの間違った点を指摘するのを手伝ってくれますか?

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. 機能性

関数エンティティは、機能、つまり複数の入力を出力に変換する機能を含む、ある種の「カプセル」です。このカプセルは、私たちが「オブジェクト」として知っているものです。この再帰の終わりにFunction.constructor === Function、言語の内省的機能の限界を設定する ID が見つかります。残りの 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 に答える