0
>>> function () {}
SyntaxError

>>> f = function() {}
f = function() {}

>>> new function() {}
>>> Object

>>> new Function()
function anonymous() {}

>>> Function()
function anonymous() {}


>>> f = (function() { a = 10; return function() {console.log(a);} })();
>>> f()
10
undefined

>>> f = (function() { a = 10; return new Function('console.log(a)'); })();
>>> f()
undefined

したがって、2 つの質問があります。

  1. 演算子Functionがなくてもコンストラクターが新しい関数を返すのはなぜですか?new

  2. Function関数はコンストラクターではなくクロージャーで作成されますか?

4

3 に答える 3

7

new演算子がなくても、Functionコンストラクターが新しい関数を返すのはなぜですか?

呼び出すFunction()ことは呼び出すことと同じnew Function()です:

Functionコンストラクターとしてではなく関数として呼び出されると、新しいFunctionオブジェクトを作成して初期化します。したがって、関数呼び出しは、同じ引数を持つFunction(…)オブジェクト作成式と同等です。new Function(…)


関数はクロージャではなく関数コンストラクターで作成されていますか?

はい、関数のスコープは、字句環境のスコープではなく、グローバル環境に設定されています。http://es5.github.com/#x15.3.2.1、ステップ11を参照してください。

11. PFormalParameterListとして、bodyFunctionBodyとして渡して、13.2で指定されたように作成された新しいFunctionオブジェクトを返します。ScopeパラメーターとしてGlobalEnvironmentを渡し、 Strictフラグとしてstrictを渡します。

つまり、Functionコンストラクターを使用することは、アクセスできるスコープに関して(関数が表示される場所に関してではなく)、グローバルスコープで関数を宣言したかのようになります。

これは、スコープが現在の実行コンテキストに基づいている関数宣言/式を使用する場合とは異なります(http://es5.github.com/#x13)。

  1. funcEnvを、実行中の実行コンテキストのLexicalEnvironmentを引数として渡してNewDeclarativeEnvironmentを呼び出した結果とします
于 2012-11-26T08:17:20.413 に答える
1

Functionはsを実装するために使用されるオブジェクトであり、function意味的には同じ基になるオブジェクトです。

ただし、afunctionはそれらが属するスクリプトと同時に解析されますが、Function本体はインスタンス化時に解析されます。これは、jsインタープリターとの動作の違いを取得する理由を説明している可能性があります。

詳細について、こちらをご覧ください。

于 2012-11-26T08:21:48.777 に答える
0

1、関数はオブジェクトを返すことができるので、オブジェクトをFunction()返すのはばかげたことではありません。すべてのブラウザで機能するとは限らないほど珍しいので、使用したい場合はドキュメントを再確認します。

2、正解。

于 2012-11-26T08:16:52.487 に答える