3

MDN では、Functions と function scopeについて、評価されるたびに解析されるとはどういう意味ですか? これはコードで確認できますか?

セクション関数コンストラクター対関数宣言対関数式の引用:

関数式および関数宣言によって定義された関数は一度だけ解析されますが、Function コンストラクターによって定義された関数は解析されません。つまり、 Function コンストラクターに渡される関数本体の文字列は、評価されるたびに解析する必要があります。関数式は毎回クロージャーを作成しますが、関数本体は再解析されないため、関数式は「new Function(...)」よりも高速です。したがって、Function コンストラクターは可能な限り避ける必要があります。

ただし、Function コンストラクターの文字列を解析することによって生成された関数内にネストされた関数式および関数宣言は、繰り返し解析され ないことに注意してください。例えば:

var foo = (new Function("var bar = \'FOO!\';\nreturn(function() {\n\talert(bar);\n});"))();
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.

私はそれをテストして理解する(しようとする)コードスニペットを書きました:

var bar = 'FOO!';
var foo = (new Function("return(function() {\n\talert(bar);\n});"))();
bar = 'FOO! again';
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.

var bar2 = 'FOO!2';
var foo2 = function() { alert(bar2); };
bar2 = 'FOO!2 again';
foo2();

どちらも「再度バージョン」を警告します。

再解析されたかどうかはどういう意味ですか?

これはコードの結果で説明できますか?

ありがとう。


参考までに、別のコード スニペットを試しました。

var bar = 'FOO!';
var string1 = "return(function() {\n\talert(bar);\n});";
var foo = (new Function(string1))();
bar = 'FOO! again';
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.
string1 = "return(function() {\n\talert(bar + ' more');\n});";
foo();

両方のアラートは、「FOO! again more」ではなく、「FOO! again」です。

4

2 に答える 2