ここには 2 つの非常に迅速なプロセスがあります。
これを書くとしたら:
function makeDigitReader () { var names; return function (n) { return names[n]; }; }
var myDigitReader = makeDigitReader();
myDigitReader に内部関数が与えられると正しく推測できます。
彼らがやっていることは、ステップをスキップすることです。括弧を追加することで、定義された瞬間に関数を起動しています。
だから、あなたはこれが起こっています:
var myDigitReader = function () {
var names = [...];
return function (n) { return names[n]; };
};
myDigitReader = myDigitReader();
何が起こったのですか?内側の関数を、以前は外側の関数だったものへの新しい値として返しました。したがって、外側の関数はもう存在しませんが、内側の関数は引き続きnames
配列にアクセスできます。
関数の代わりにオブジェクトを返すこともできます。また、これらのオブジェクトのプロパティ/関数は、最初に関数の内部にあったものにもアクセスできます。
通常、これらの即時呼び出し関数は括弧で囲まれていますvar myClosure = (function() { return {}; }());
。
戻り値を値に代入せずに実行する場合は、コンパイラに評価させるために、括弧で囲むか、その前にある種のオペランドを追加する必要があります。
!function () { doStuffImmediately(); }(); // does stuff right away
function () { doStuffImmediately(); }(); // ***ERROR*** it's an unnamed function
あなたが持つかもしれないすべての質問に答えることを願っています.