1

各関数オブジェクトには、2 つの「隠し」プロパティが必要です (JavaScript の良い部分、関数の章による)。

context

code

これらのプロパティにアクセスする方法はありますか?

4

1 に答える 1

2

toString() (または Mozilla の非標準のtoSource() )を使用して、関数コードに非常に簡単にアクセスできます。

var x = function() { alert('Here is my happy function'); };
console.log(x.toString());

コンテキストに関しては、DC は単純なもの以上のものを意味していると思いますthis。実際に実行コンテキストについて書いています。

更新: ES5 仕様で興味深いスニペットを見つけました。ここでは、これら 2 つのプロパティが実際にはいくつかの詳細で説明されており、抽象的な概念としてではありません。

13.2 関数オブジェクトの作成

FormalParameterList で指定されたオプションのパラメーター リスト、FunctionBodyで指定された本体、 Scopeで指定されたレキシカル環境 、およびブール フラグ Strict を指定すると、 Function オブジェクトは次のように構築されます。

...

F の [[Scope]] 内部プロパティを Scope の値に設定します。

...

F の [[Code]] 内部プロパティを FunctionBody に設定します。

同時に:

レキシカル環境と環境レコードの値は純粋に仕様メカニズムであり、ECMAScript 実装の特定のアーティファクトに対応する必要はありません。ECMAScript プログラムがそのような値に直接アクセスしたり操作したりすることは不可能です。

Scopeそれで、関数のプロパティへのアクセスに関する質問はこれで終わりだと思います。

プロパティに関しては、Matt が正しく気付いたように、Codeを使用した読み取り専用アクセスtoString()は実装に依存しますが、実装されない場合よりも多くの場合実装されます。)

于 2012-09-04T18:13:50.767 に答える