bugfix> javascript > 投稿

この例のクロージャに関して少し混乱しています

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 件
  • ここで何が起こっているかを段階的に見てみましょう:

    引数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の値への単なる参照です。

  • 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は、その匿名関数のクロージャ内で終了します。この場合、外側の関数が戻るまで、実行されるたびに匿名関数によって使用されるローカル実行コンテキストを変更できます。

あなたの答え