5

Stoyan Stefanovのオブジェクト指向JavaScript(84ページ)からの引用:

ここに画像の説明を入力してください

ポイントaにいる場合は、グローバルスペース内にいます。関数Fの空間内にある点bにいる場合は、グローバル空間とF空間にアクセスできます。関数Nの内側にあるポイントcにいる場合は、グローバルスペース、Fスペース、およびNスペースにアクセスできます。bはFの外側では見えないため、aからbに到達することはできません。必要に応じてcからbに、またはNからbに取得します。興味深いのは、閉鎖ということですが、どういうわけかNがFから抜け出し、グローバル空間にたどり着いたときに起こります。」

上記の太字の文は、「関数N内の点cにいる場合は、グローバル空間とN空間にアクセスできます」に変更する必要があると思います(F空間を含めるべきではありません。ポイントcはN空間とグローバルスコープGにしかアクセスできないためです。)

私は正しいですか?ありがとう。

4

5 に答える 5

2

Nいいえ、それは関数から返された関数であり、したがって、内部で宣言されFた変数に(クロージャを介して)アクセスできるということだと思います。例(ライブ例):bF

function F() {
    var b = 10;
    return function () {
        console.log(b);
    };      
}

var N = F(); //N is a reference to the anonymous function returned from F

N(); //logs '10' because we still have access to b (because of the closure)
于 2012-10-05T10:17:48.253 に答える
1

いいえ、あなたは正しくありません。

N点線の円は、の内部にあるように、の実際のスコープを表すことになっていFます。

于 2012-10-05T10:17:58.323 に答える
1

いいえ、ポイントcで、実際にF空間にアクセスできます。

この例:

function F() {

  var b = 42;

  function N() {
    alert(b);
  }

  return N;

}

// get a reference to the function N in the global scope:
var n = F();
n(); // shows 42
于 2012-10-05T10:19:37.340 に答える
1

いいえ、あなたは正しくありません。以下のコードを見てください。

// the global space
var g = 'g';

function F() {
  // the F space
  var a = 'a';
  function N () {
    // the N space
    // here you could access g in the global space and a in the F space.
    var c = 'c';
    console.log(g, a);
  }
}
于 2012-10-05T10:20:18.013 に答える
1

他の人が言ったように、いいえ。

クロージャについてのほぼ全体的なポイントは、内部関数への外部参照は、その内部関数を存続させるだけでなく、その外部環境が実行された関数から生じた場合でも、それが作成された外部環境にアクセスできるようにすることです。完了して戻ってきました。

N青が内側に表示されF、点線のバージョン(への参照N)が外側に表示されている場合、図はクロージャーをよりよく示していると思いますF

引用されたステートメントの最後の文も改善される可能性があります:

興味深いこと—クロージャ—は、Fの外側にNへの外部参照が存在するときに発生します。

このバージョンでは、グローバルスペースについての言及が回避されていることに注意してください。クロージャーを形成するには、外部スコープで十分です。

声明はさらに、クロージャの形成を可能にするメカニズムはガベージコレクションの抑制であると言うことができます。

警告:ウェブと本の両方で、「閉鎖」の多くの悪い定義と説明があります。StackOverflowsの現在の「closures」のタグwikiエントリはその好例です。

于 2012-10-06T01:27:36.653 に答える