この例のクロージャに関して少し混乱しています
function f(param){
var n=function(){ //n is assigned the function that returns param
return param;
};
param++; //increments 1 and n keeps a reference to the param
return n;
}
var inner=f(1);
inner();
私はクロージャの概念を理解していますが、この例でどのように機能するのか理解していません。
回答 3 件
で
param
関数f
の引数と同じではない関数のローカル変数になります 。関数f
n
を返しています これは機能ですfunction f(param) { var n = function() { //n is assigned the function that returns param return param; }; param++; // here param become a local variable of the function f return n; } var inner = f(1); console.log(inner());
この例では、ローカル変数paramは、その匿名関数のクロージャ内で終了します。この場合、外側の関数が戻るまで、実行されるたびに匿名関数によって使用されるローカル実行コンテキストを変更できます。
関連した質問
- HTML/Javascriptでボタンがクリックされたかどうかを確認する方法はありますか?
- JS関数を呼び出せません:構文の間違いまたは目が交差しすぎていますか?
- javaスクリプトの矢印関数
- この単純なコードでインポートとエクスポートを使用するにはどうすればよいですか?
- メソッドを持つクラスの代わりに、1つまたは2つの高階関数/クロージャを作成するにはどうすればよいですか?
- javascriptのforループで文字列に母音を表示できません
- フィルタ付きのVueテンプレートで三項演算子を使用するにはどうすればよいですか?
- HTML計算機で対数を実行する方法は?
- ソース配列に一意の値がなくなるまで、数値のソース配列から乱数を取得するための最良の方法は何ですか?
- 突然変異のないカントディスパッチアクション
ここで何が起こっているかを段階的に見てみましょう:
引数1で関数fを呼び出し、結果を変数innerに割り当てます。
f(1)が呼び出されると、fのスコープには2つの変数(paramとn)があります
変数paramsは渡された引数で、nは関数です。
したがって、関数fの内部- 変数nは関数に初期化され、paramがインクリメントされ、関数fからnが返されます。
この返された関数(n)はinnerに割り当てられます。
innerが呼び出されると、paramを返します。これは、クロージャのために関数nのスコープ内にあります。
手順が明確であったことを願っています。
さて、あなたはnがどのようにparam ++にアクセスしたのか疑っています。そうではなく、param ++はf(1)が呼び出されたときにすでに実行されていました。すべてのnは、paramの値への単なる参照です。