JavaScript返却関数はどう分かりますか?

1560 ワード

ケース分析
function main() {
  var name = 'xiaoming';
  return function () {
    console.log(name);
  }
}

var output = main();
output();
main()関数の実行は関数を返し、outputに値を与えます.これはoutputの定義を説明しています.外部ではなぜ私がmain()の外部でoutput()を実行していますが、nameを使って正常にnameの値を出力できますか?
理解する
上の関数は下のコードと同じです.
var output;
function main() {
    var name = 'xiaoming';
    output = function(){
        console.log(name);
    };
}
main();
output();
これは分かりやすいようです.
outputは、main関数以外に、グローバル変数を宣言しています.
しかし、実際の値は、main関数の内部に割り当てられています.
outputはmain関数内部のその関数を指します.
この関数のスコープはメーン関数の中にあります.
nameもmain関数で定義されています.outputが指す関数にとって、nameはまだその大域変数です.
こうしてみると、正常にnameを使うことができるのもおかしいと思います.
このことから,変数outputの作用領域は大域的であるが,その指向関数の作用領域には影響しない.
元のケースに戻ります.
  • main関数が返したその関数は、その作用領域がmain関数の内部にあり、output変数に値を与えても、関数自体の作用領域は変わらない.
  • nameはその関数に対してグローバル変数であるため、正常に使用できます.
  • 閉ループ導入
    上記の例は、実はクローズドです.クローズドとは、特殊な対象です.二つの部分から構成されています.関数とその関数を作成する環境です.環境はクローズドパッケージ作成時のスコープ内の任意の局所変数から構成される.
    クローズドとは、関数と宣言関数の場合の語法環境です.この「環境」には、クローズド・パケットを作成する際の作用領域におけるすべての局所変数が含まれています.
    jsにおける関数の変数のスコープは、関数が呼び出されたときに決定されるのではなく、作用ドメインチェーンで定義されています.クローズドの特性のために、関数がネストされた関数を定義し、それをリターン値としてどこかの属性に格納すると、このネストされた関数を参照しながら、そのスコープを保存する外部参照がありますが、このスコープはネスト関数を含んだ局所変数と、彼らの外部関数を定義する局所変数とが含まれています.
    本例では、main()を実行して、ネスト関数をoutputに返すと、output()で生成された変数作用ドメインチェーンには、main()のnameおよび値が含まれています.だから、nameの値を正常に出力することができます.
    クローズドの特徴としては、元のスコープの内容を持ち出し(実際には同じスコープで変数がアクセスできる)ことです.ここでは、あるスコープの下にある変数(関数変数を含む)がまだ使われている場合、このスコープの他の変数はすべて廃棄されません.