質問

ついてはどのように説明するのかJavaScriptの閉鎖を人に知識の概念で構成されており、例えば関数、変数など)を行いませんか閉鎖すか?

のスキーム例 されWikipediaが、残念ながらなかった。

役に立ちましたか?

解決

JavaScript初心者のための閉鎖

提出したモーリスに火2006-02-21 10:19.地域-編集します。

閉鎖は魔法であってはいけません

このページで説明してい止めるようプログラマーが理解できて使用働JavaScriptコードです。あなた達の機能ります。

クロージャ ない 理解度のコアコンセプトはgrokked.しかし、その不可解読みず理論的、学術的に向け説明!

この記事ではプログラマがプログラミング経験者が望ましい主流言語で読み、以下のJavaScript関数:

function sayHello(name) {
  var text = 'Hello ' + name;
  var say = function() { console.log(text); }
  say();
}
sayHello('Joe');

二つの活動を紹介します。

  • 時の機能foo ことを宣言しその他の機能(バー baz族は、ローカルな変数が作成された foo破壊されるのではなく の機能を終了します。の変数だけると見えなくなるのです。 foo その巧妙を返し機能 barbaz, は、引き続き読み書き、お互いのこの店は家族の変数の閉鎖")なので手を出とな人の話 foo ます。

  • 閉鎖ることで、これからも支援 最初のクラスの機能;このように表現できる参照変数をその範囲内になっている最初に宣言され、割り当てを変数として渡される引数の機能、または返却しています。

の例を閉鎖

次のコードを返しますへの参照機能:

function sayHello2(name) {
  var text = 'Hello ' + name; // Local variable
  var say = function() { console.log(text); }
  return say;
}
var say2 = sayHello2('Bob');
say2(); // logs "Hello Bob"

最JavaScriptのプログラマーかへの参照関数が返される変数(say2)は上記のコードです。かない場合には、それを見ていく必要があることを前きを抑止するためには、必要かプログラマーを使用Cってくださいというふうに思っての機能として返すポインタ機能の変数 saysay2 それぞれのポインタを機能です。

があるとの決定的な違いはCのポインタ機能は、JavaScriptを参照します。JavaScriptでは、のようなものと考えることができる機能基準変数としての両方を指すポインタ機能 として として隠れたポインタ。

上記のコードは、閉鎖が匿名機能 function() { console.log(text); } 宣言 内部 他の機能 sayHello2() この例です。JavaScriptでは、ご利用の場合 function キーワード内の他の機能を作成する。

Cおよび多くの共通言語 機能を返します、すべてのローカル変数がなくなりアクセスなのでスタックフレームが破壊されました。

JavaScriptの場合を宣言する機能やその他の機能、そしてローカル変数の外部機能でアクセスから帰国後ます。このことは上記しますので、電話の機能 say2() してから返される sayHello2().このコードを参照変数 text, であった 局所変数 の機能 sayHello2().

function() { console.log(text); } // Output of say2.toString();

を見出力 say2.toString(), このコードと変数 text.匿名の機能を参照 text を保有する価値 'Hello Bob' ためのローカル変数 sayHello2() して密かに保たれ生きています。

の才能は、JavaScriptの機能を参考にも秘密の閉鎖で構成されてと同様に委譲方法のポインタラの秘密への参照オブジェクトです。

より例

何らかの理由に閉鎖にも本当に理解しにくいただいてですが、あの例のかが明確になり、どのように仕事(も)が、私のおすすめの例はじまりますか。ご利用開始の閉鎖せずに十分に理解しどのように、まだことを非常に奇妙な変!

例3

この例では、ローカル変数にコピーされません—保存されます。として知られるなど、多くのスタックフレームに滞在生きていメモリの後も外側の機能を終了!

function say667() {
  // Local variable that ends up within closure
  var num = 42;
  var say = function() { console.log(num); }
  num++;
  return say;
}
var sayNumber = say667();
sayNumber(); // logs 43

例4

すべての三つのグローバル機能の共通の参考に 閉鎖なすべての宣言された内電話 setupSomeGlobals().

var gLogNumber, gIncreaseNumber, gSetNumber;
function setupSomeGlobals() {
  // Local variable that ends up within closure
  var num = 42;
  // Store some references to functions as global variables
  gLogNumber = function() { console.log(num); }
  gIncreaseNumber = function() { num++; }
  gSetNumber = function(x) { num = x; }
}

setupSomeGlobals();
gIncreaseNumber();
gLogNumber(); // 43
gSetNumber(5);
gLogNumber(); // 5

var oldLog = gLogNumber;

setupSomeGlobals();
gLogNumber(); // 42

oldLog() // 5

三つの機能を共有する同一の閉包におけるローカル変数 setupSomeGlobals() つながる機能が定義されています。

注上記の例では、お問い合わせいただいた場合 setupSomeGlobals() 再度、新しい開閉式(スタックフレーム!) を作成します。旧 gLogNumber, gIncreaseNumber, gSetNumber 変数は上書きされ 新しい とする機能を新たに開閉。(JavaScriptでき宣言は、関数内でも機能するには、内部機能(s)is/are再現も 時間外の機能が呼び出されます。)

例5

この例では、閉鎖が含まれてローカル変数が宣言された外側に機能する前に終了した.この変数 alice 実際に宣言された後、匿名の機能です。の機能匿名で宣言されず、その関数が呼び出されるまで、アクセスする alice 変数が alice の範囲(JavaScriptは 変動巻上).も sayAlice()() で直接通話機能の参照から返される sayAlice() —それは全く同じとしたいと思っていたはずなので、一時的に変更します。

function sayAlice() {
    var say = function() { console.log(alice); }
    // Local variable that ends up within closure
    var alice = 'Hello Alice';
    return say;
}
sayAlice()();// logs "Hello Alice"

トリッキー:注意 say 変数は内部に閉鎖きるその他の機能は次のように宣言され内 sayAlice(), んでいれば、それらを受け取ったアクセスを再帰的にの内部機能です。

例6

その金と銀の使用法がひときに実gotcha多くの人々でに必要なものを理解します。うよう十分注意してくださいますを定義する機能、ループ:地元の変数からの閉鎖などが最初に思いのまま。

きを理解する必要がある"可変巻き上げ機能でJavascriptを把握するため、この例です。

function buildList(list) {
    var result = [];
    for (var i = 0; i < list.length; i++) {
        var item = 'item' + i;
        result.push( function() {console.log(item + ' ' + list[i])} );
    }
    return result;
}

function testList() {
    var fnlist = buildList([1,2,3]);
    // Using j only to help prevent confusion -- could use i.
    for (var j = 0; j < fnlist.length; j++) {
        fnlist[j]();
    }
}

 testList() //logs "item2 undefined" 3 times

の線 result.push( function() {console.log(item + ' ' + list[i])} 追加の参照匿名の機能の結果を配列に格納します。だあまり馴染みがない匿名の機能の考えのように:

pointer = function() {console.log(item + ' ' + list[i])};
result.push(pointer);

りますのでご注意くださの例では、 "item2 undefined" グ三倍!このような例が閉鎖の局所変数 buildListresult, i, listitem).場合の匿名の関数が呼び出されるの fnlist[j]();彼らはすべての単一の閉鎖、およびその利用の現在の値 iitem その一つの閉鎖が i 価値の 3 でループを完成させた、 item 価値の 'item2').注意して割り出しから0る item 価値の item2.のi++ンド i の価値 3.

えば作業が容易になる場合があり見とも何度もひっくり返したくなるブロックレベル変数の宣言 item 使用の let キーワード)の代わりに機能-scoped変数の宣言の var キーワードとなります。この変更が行われ、その後各匿名の配列 result 自閉鎖;場合の例では出力は下記の様になります:

item0 undefined
item1 undefined
item2 undefined

の場合は変数 i ものを使用して定義され let の代わりに var, その出力です:

item0 1
item1 2
item2 3

例7

この最後の例では、話の主な機能を分離にあります。

function newClosure(someNum, someRef) {
    // Local variables that end up within closure
    var num = someNum;
    var anArray = [1,2,3];
    var ref = someRef;
    return function(x) {
        num += x;
        anArray.push(num);
        console.log('num: ' + num +
            '; anArray: ' + anArray.toString() +
            '; ref.someVar: ' + ref.someVar + ';');
      }
}
obj = {someVar: 4};
fn1 = newClosure(4, obj);
fn2 = newClosure(5, obj);
fn1(1); // num: 5; anArray: 1,2,3,5; ref.someVar: 4;
fn2(1); // num: 6; anArray: 1,2,3,6; ref.someVar: 4;
obj.someVar++;
fn1(2); // num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;
fn2(2); // num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;

概要

場合に思うので全く不明で、その最善のことは、サンプルを動作させてみて下さい.読書の説明はどのように理解します。私の説明のクロージャやスタックフレーム等は技術的に正しいという総起立場に立って、危機に臨むことを知りました一度は基本的な考え方としてはgrokkedすることができるので、詳細は後述します。

最終ポイント:

  • き使用 function 内部も機能閉鎖を使用します。
  • き使用 eval() 内部機能は、閉鎖を使用します。してください eval 参照変数の機能、 eval きを使って<div>タグを埋め込む新たなローカル変数を使用 eval('var foo = …')
  • ご利用の際は new Function(…)機能のコンストラクタ 内部関数、など問いません。しかし、新機能を参照できない、ローカル変数の外側の機能です。)
  • 閉鎖に当サイトでは、以下のブラウザなどをコピーのすべてのローカル変数としては機能が終了した.
  • するのがいいでしょうによって行われたと考えることが閉鎖は常に作成でエントリの機能、ローカル変数に加えられる。
  • 新しいローカル変数は常時の機能閉鎖はこれらの機能が含まれて機能を宣言の中で、参照する内部機能のいずれかに返却または外部参照が保たれか)となっていました。
  • 二つの機能がようなものだというのは同じソーステキストが全く異なる挙動のために隠れた'にあります。とは思わないJavaScriptコードを実際に見た場合の機能を参照して閉鎖います。
  • だい動的ソースコードの変更(例えば: myFunction = Function(myFunction.toString().replace(/Hello/,'Hola'));でな場合 myFunction は閉鎖(もちろん、いつも考えてソースコードを文字列置換の実行時ですが---).
  • を取得できることが関数の宣言内の関数の宣言内での機能を---ときの閉鎖による。
  • 思い通常の閉鎖までの長期の両方の機能を変数として捉えられています。ご注意使用しないことを定義できます。
  • 思閉鎖JavaScriptの異なる通常から機能ます。

リンク

感謝

の場合 だけで たクロージャ(こちらかです。), そんな意でございますので変更はあるがこの記事がより明確になる。信濃町メディアセンター morrisjohns.com (morris_closure@).おんせんグルJavaScript—も抑止するためには、必要か


オリジナルポストによるモリスンの インターネットアーカイブ.

他のヒント

きの機能キーワードやその他の機能であり、その内機能へのアクセス変数の外部機能です。

function foo(x) {
  var tmp = 3;

  function bar(y) {
    console.log(x + y + (++tmp)); // will log 16
  }

  bar(10);
}

foo(2);

これは常にログ-16、 bar アクセスできる x ると定義された引数 foo, でもアクセス tmp から foo.

その ます。機能がない 戻り するための呼びます。 単にアクセス変数以外の当面の語彙の範囲を閉鎖.

function foo(x) {
  var tmp = 3;

  return function (y) {
    console.log(x + y + (++tmp)); // will also log 16
  }
}

var bar = foo(2); // bar is now a closure.
bar(10);

上記の機能もログ-16、 bar できるものをご参照 xtmp, ものではなくなった直接のです。

しかし、 tmp まだハン中 bar's"の閉鎖をもって増加されます。ますたびに採番されま話 bar.

最も単純な例の閉鎖である

var a = 10;

function test() {
  console.log(a); // will output 10
  console.log(b); // will output 6
}
var b = 6;
test();

がJavaScript関数が呼び出され、新しい実行コンテキストが作成されます。とともに、関数を引数のオブジェクト、この実行コンテキストを受けてまかなわれています。すべての変数を宣言された外にアピールするとともに上記例では、'a'や'b').

を作成することができ以上の閉鎖機能は、返還することでスできる内容について、または設定してグローバル変数です。すべてのそれらを参照して x と同じ tmp, ものを作成するのではありませんぞ。

こちらの番号 x は、リテラル。ど他のリテラルでJavaScriptの場合 foo "と呼ばれるもの xコピーfoo を引数として x.

一方、が、必ずJavaScriptの使用を参照の処理時ます。ればいいという foo オブジェクトの閉鎖を返します 参考 このオブジェクト!

function foo(x) {
  var tmp = 3;

  return function (y) {
    console.log(x + y + tmp);
    x.memb = x.memb ? x.memb + 1 : 1;
    console.log(x.memb);
  }
}

var age = new Number(2);
var bar = foo(age); // bar is now a closure referencing age.
bar(10);

期待どおりに、呼び出 bar(10) ンド x.memb.何かをさせる計画であるとのことである x は単に参照が同じオブジェクトとしての age 変数!後のカップル電話 bar, age.memb 2!この参照のためにメモリリー HTMLオブジェクト。

水フォーラム事務局長竹村公太郎この答えしたことになった:

のような古いアルバートは言った:"できない場合は説明では、年齢、本当には理解できないのです。".いくつかについて説明してくれました。JS閉鎖に27歳の友人と完全に失敗しました。

誰でもう私は6妙に興味があることがございます!

きだと思うのだったという試みの最初の質問文字通り.その後、問題になっている変数回通じているわけですから、かなりの答えが今もなん&されているのが意外でした。一方、一般の物語が残る楽しさがあります。


一えとメタファーを説明するには難しい概念でい手と話しました。

一時間:

がありましたお姫さま---

function princess() {

上野動物園の人気者に素晴らしい世界を養います。今の彼女のリスをモチーフに乗っていたの周りの彼女の世界に探る戦ドラゴンズ、出会う動物、および他の多くの奇想天外な物です。

    var adventures = [];

    function princeCharming() { /* ... */ }

    var unicorn = { /* ... */ },
        dragons = [ /* ... */ ],
        squirrel = "Hello!";

    /* ... */

彼は、いつもに戻って彼女に鈍世界の雑用しなければ成らない。

    return {

そうして彼女の最新の驚きの冒険しています。

        story: function() {
            return adventures[adventures.length - 1];
        }
    };
}

もう見はちょっと女の子...

var littleGirl = princess();

...を語マジックとファンタジーを行き来する。

littleGirl.story();

ものの、大人に知っていた実姫いないものと考えてunicornsまたはドラゴンズでいます。の主張が存在していると言われているその中の少女たちを描いたものです。

しかし現実の真理;その少女の姫内---

...本当はお姫様のちょっと女の子がいました。

の問題を真摯に受け止め、必見の代表的な6歳できるcognitivelyも確かに、興味のある方にはJavaScriptがこんなになります。

幼児教育:5-7年 う:

お子されるということがわかっ二つのステップです。例えば、このことを子ども"のキッチンやくゴミ袋"なくしていることを覚えておく。

使用できますこの例で説明閉鎖しており

キッチンには閉鎖を持つローカル変数と呼ばれる trashBags.機能もありますのキッチンと呼ばれ getTrashBag ることが一つのゴミ袋を返します。

またこのコードJavaScriptのようになります:

function makeKitchen() {
  var trashBags = ['A', 'B', 'C']; // only 3 at first

  return {
    getTrashBag: function() {
      return trashBags.pop();
    }
  };
}

var kitchen = makeKitchen();

console.log(kitchen.getTrashBag()); // returns trash bag C
console.log(kitchen.getTrashBag()); // returns trash bag B
console.log(kitchen.getTrashBag()); // returns trash bag A

さらにポイントを説明するのはなぜ閉鎖は興味深い:

  • 各時間 makeKitchen() が呼び出されると、新たに閉鎖され、それ自身の個別の trashBags.
  • trashBags 変数は現地の各キッチンにアクセスすることはできませんが、内側の機能を getTrashBag 物件はなくてはならない。
  • 各機能通話を作成し、閉鎖がなく、閉鎖周りのない限り、内部の機能、アクセスの内部を閉鎖できるという外部から開閉。還元のオブジェクト getTrashBag 機能させることです。

藁人

いったかを知る必要が回のボタンをクリックすれば何とかは、各ク---

かなり明らかな解決

// Declare counter outside event handler's scope
var counter = 0;
var element = document.getElementById('button');

element.addEventListener("click", function() {
  // Increment outside counter
  counter++;

  if (counter === 3) {
    // Do something every third time
    console.log("Third time's the charm!");

    // Reset counter
    counter = 0;
  }
});
<button id="button">Click Me!</button>

今までにな侵入、外側の範囲を加える変数は、唯一の目的は、トラックの数です。一部の状況になり得るかということですが、好ましいとして外部アプリケーションが必要なアクセスすることができます。この場合、まだ変わりゆく第三クリックの挙動することが望ましい。 同封してこの機能のイベントハンドラ.

このオプション

var element = document.getElementById('button');

element.addEventListener("click", (function() {
  // init the count to 0
  var count = 0;

  return function(e) { // <- This function becomes the click handler
    count++; //    and will retain access to the above `count`

    if (count === 3) {
      // Do something every third time
      console.log("Third time's the charm!");

      //Reset counter
      count = 0;
    }
  };
})());
<button id="button">Click Me!</button>

通知は数え上げればきりがない。

上記の例では、これまでの開閉口挙動に関する研究が可能です。 この動作を可能に他の機能にアクセスの範囲を作成し、無期限に設定されています。 ほとんどの場合、私はすぐに呼び出し機能を返しまう機能がんの還元にアクセスできる内部カウント変数のための開閉口挙動に関する研究先に説明したこの結果、民間の範囲での利用によりその機能---プ?うに希釈して抑えたいのですが---。

単純であることを閉鎖

//          _______________________Immediately invoked______________________
//         |                                                                |
//         |        Scope retained for use      ___Returned as the____      |
//         |       only by returned function   |    value of func     |     |
//         |             |            |        |                      |     |
//         v             v            v        v                      v     v
var func = (function() { var a = 'val'; return function() { alert(a); }; })();

すべての変数以外、返される機能は、返される機能、なに直接返される関数オブジェクト...

func();  // Alerts "val"
func.a;  // Undefined

もっと簡単に作って欲しい。で次の例では、カウント変数内に含まれるとともに、常に利用できるイベントハンドラでするものではなく、その状態からクリックをクリックします。

また、このprivate変数状態 完全に アクセスの両方のために、朗読が提供を民間scoped変数です。

がとても苦手なのでお願いしま;だ今や完全に封止するための

フルブログ (jQueryへの配慮)

クロージャは言い尽くせないものが使用されますの一部動作誰もが直感的に期待を作ります。んなアイディアについて(および方法 I かいがい状況をなして

    var bind = function(x) {
        return function(y) { return x + y; };
    }
    
    var plus5 = bind(5);
    console.log(plus5(3));

どのような出来事が起きないようにとこちらの場合はJavaScript なかった 知閉鎖?で置き換えに最終ラインの方法を体(基本機能電話くだ

console.log(x + 3);

により、これまでの定義 x?しか定義では、現在の範囲においの唯一のソリューションがあ plus5 運ぶ その範囲(というか、その親会社の範囲)。このように、 x 明確に定義されてい合の値が5.

これには明確な複数可能)誤解から閉鎖されるもののその他の応答となります。

  • 閉鎖なたのお帰りの際に内部に機能です。 実は、囲む機能 なに戻る必要があるで ためには、その閉鎖を作成します。ばくを割り当て内側の機能を変数に外側の範囲、またはパスでの引数として機能することと、すぐにまたは随時です。そのため、閉鎖、囲む機能あれ などに囲まればならない めには、内部機能へのアクセスが閉鎖する毎に内部関数が呼び出され、前後に囲の機能に戻ります。
  • を閉鎖しないを参照のコピー 古い価値観 変数にした。 の変数が自身の一部閉鎖の値がアクセス時の変数の値の時間でご利用いただけます。この内部関数の内部で作成された繰り返しできるトリッキー、それぞれのアクセスと同一の外部変数によ掴むのコピーの変数の関数を作成し、それは呼び出されます。
  • の"変数"の閉鎖を含む任意の名機能 内で宣言した。ついては、引数の機能です。閉鎖へのアクセス、その閉鎖を含むの変数に対する正しい世界です。
  • 閉鎖の使用メモリーもあるんですが、その原因にメモリリーク 以来、JavaScriptによるもの掃除はプリンシパルに対して自らが環状構造をなされます。Internet Explorerのメモリリークを伴う閉鎖の作成に失敗した場合に切りDOMの属性値を参照する閉鎖、このように維持参考文献にある円形の構造物です。

OK、6歳の閉鎖ます。いつも聞きたい、最も単純な例の閉鎖?

もう次の状況:ドライバーが座った車です。において、カーシェアリングです。平面上の空港です。のドライバにアクセスも以下の車内は、飛行機に乗る場合であっても平面葉では、空港である。それだけです。電源を入れたとき27日に 詳細について またはその例です。

ここではあまりに変換私の面物語のコードです。

var plane = function(defaultAirport) {

  var lastAirportLeft = defaultAirport;

  var car = {
    driver: {
      startAccessPlaneInfo: function() {
        setInterval(function() {
          console.log("Last airport was " + lastAirportLeft);
        }, 2000);
      }
    }
  };
  car.driver.startAccessPlaneInfo();

  return {
    leaveTheAirport: function(airPortName) {
      lastAirportLeft = airPortName;
    }
  }
}("Boryspil International Airport");

plane.leaveTheAirport("John F. Kennedy");

A 閉鎖 はるかのようにオブジェクトです。でインスタンスを生成でき関数を呼び出します.

の範囲 閉鎖 JavaScriptでは、語彙と、あるいはスクリ内に含まれる機能の 閉鎖 所属が変更登録が可能です。

可変に多く含まれていると言われる 閉鎖 の場合

  1. 割り当てで var foo=1; または
  2. かく書 var foo;

場合には内部の機能(機能内に収まるように別の機能にアクセスなどの変数を定義することなく、で、その範囲とvarで変数を変更する機能を提供するコンテンツの変数の外 閉鎖.

A 閉鎖 outlivesのランタイムの機能の芽生ます。場合その他の機能が出ることができなければ、この 閉鎖範囲 たかという定義(インスタンスとしての戻り値は、引き続き参照する 閉鎖.

function example(closure) {
  // define somevariable to live in the closure of example
  var somevariable = 'unchanged';

  return {
    change_to: function(value) {
      somevariable = value;
    },
    log: function(value) {
      console.log('somevariable of closure %s is: %s',
        closure, somevariable);
    }
  }
}

closure_one = example('one');
closure_two = example('two');

closure_one.log();
closure_two.log();
closure_one.change_to('some new value');
closure_one.log();
closure_two.log();

出力

somevariable of closure one is: unchanged
somevariable of closure two is: unchanged
somevariable of closure one is: some new value
somevariable of closure two is: unchanged

書いたブログ械的風味さん一応前に線路を説明する抑止するためには、必要かここでは、いつの閉鎖的 なぜ んでいます。

クロージャめましょう機能 してい 根気強く、プライベート変数 - この変数のみ 機能について知っていった 追跡情報から、前回 このように実行する。

その意味でのような関数法のようなオブジェクトの個人属性です。

グランドオープンを迎える。:

それではこれらの閉鎖thingys?

クロージャはシンプルです:

次の例では全てのポイントJavaScriptを抑止するためには、必要か*  

こちらは工場を製造する計算機能の追加および増殖:

function make_calculator() {
  var n = 0; // this calculator stores a single number n
  return {
    add: function(a) {
      n += a;
      return n;
    },
    multiply: function(a) {
      n *= a;
      return n;
    }
  };
}

first_calculator = make_calculator();
second_calculator = make_calculator();

first_calculator.add(3); // returns 3
second_calculator.add(400); // returns 400

first_calculator.multiply(11); // returns 33
second_calculator.multiply(10); // returns 4000

のポイント: 各呼び出 make_calculator 新しく作成し、局所変数 n, は、引き続き利用されるようになってる計算機の addmultiply 機能し make_calculator に戻ります。

していますがスタックフレームは、これら電卓のようで不思議:どういアクセス nmake_calculator も進めていきます。その答えは想像もつかないJavaScriptを使用しない"スタックフレーム"であり、グリーンハウスより"ヒープフレーム"をした後も存続でき関数呼び出しました。

内部関数のように addmultiply, は、アクセス変数を宣言された外側の機能**, と言われるもの 閉鎖.

では、長文ありがとうございましくべりを抑止するためには、必要か



* 例えば、すべてのポイントは、"閉鎖のためのダミー"第れ 他の答え, を除き、例6となる変数を使用することができますの前に宣言されていて、何もかも完全に無関係を抑止するためには、必要か"は、いうまでもなくすべてのポイント の受け答え, を除いて、ポイント(1)機能コピーその引数に局所変数の名前の関数の引数、(2)そのコピー数を新しく作成し、オブジェクトのコピーを参照す別の参照が同じオブジェクトです。これらのも良いかも完全に無関係を抑止するためには、必要かでも同様の事例 この答え が少以下さい.カバーしなのポイント この答え または このコメント, は、JavaScriptのが難しいプラグインの 現在の の価値ループ変数への内部機能:に差し込む"ステップできることとしますヘルパーの機能を含むお客様のご利機能が呼び出された各ループになります。(厳密に言えば、内側の機能にアクセスのヘルパー関数のコピーの変数というよりもむしろ何も接続します。) 再度、非常に有の作成時に閉鎖なのか知ることができる。はいただけます。が追加の混乱により閉鎖作業の中で別の機能言語のようにMLでは、数値により収納スペースを提供し続けたい人の閉鎖について(すなわち、"差し込む"方法とは、単に不正なJavaScriptでは、変数は常に行きめの収納スペースとなる値です。

** 他の外部機能、それはネストしたものグローバルな文脈として この答え 点を明確にする。

かいについての説明を六年

すかる-できる自家と呼ばれているかもしれませんね。がお母さんは子どもの子どめいんと自分のものですか。その両親は自分の家でも誰かがそれを子どもがおかもしれませんね。", その答えは"このハウスです。", ポイント、ハウスの。は、"閉鎖"は、能力の子どもがいたとしても海外できるように言うことは、もは親会社のクライアントを持っているのです。

教えてください閉鎖の5歳?*

たなければならないと思い Googleの説明 としては簡潔なもの:

/*
*    When a function is defined in another function and it
*    has access to the outer function's context even after
*    the outer function returns.
*
* An important concept to learn in JavaScript.
*/

function outerFunction(someNum) {
    var someString = 'Hey!';
    var content = document.getElementById('content');
    function innerFunction() {
        content.innerHTML = someNum + ': ' + someString;
        content = null; // Internet Explorer memory leak for DOM reference
    }
    innerFunction();
}

outerFunction(1);​

Proof that this example creates a closure even if the inner function doesn

*C#質問

私が学び合うことによって、よりよく良い/悪い。ことが多いというコードについて、ワコードする人が出会いの場とします。まとめ a jsFiddle のことは比べようというところに帰着の違いを簡単な説明のようです。

閉鎖を行いright:

console.log('CLOSURES DONE RIGHT');

var arr = [];

function createClosure(n) {
    return function () {
        return 'n = ' + n;
    }
}

for (var index = 0; index < 10; index++) {
    arr[index] = createClosure(index);
}

for (var index in arr) {
    console.log(arr[index]());
}
  • 上記コード createClosure(n) 呼び出し毎に繰り返し処理のループを実行します。ご注意についての変 n することを示す 新しい 変数が作成された新しい機能範囲は同一の変数として index する外側の範囲におい

  • この新しい範囲および n は、その対象範囲することこそ、重要であり、これまでには10に別のスコープ各なります。

  • createClosure(n) を返す機能を返しますnるとともに、その範囲.

  • 各範囲 n 結う値があった場合 createClosure(n) 呼び出しは入れ子関数が返されたもの絶対値を戻します。 n があった場合 createClosure(n) たメソッドが呼び出されます。

閉鎖を行っ

console.log('CLOSURES DONE WRONG');

function createClosureArray() {
    var badArr = [];

    for (var index = 0; index < 10; index++) {
        badArr[index] = function () {
            return 'n = ' + index;
        };
    }
    return badArr;
}

var badArr = createClosureArray();

for (var index in badArr) {
    console.log(badArr[index]());
}
  • 上記のコードをループした動きとなりましたが、 createClosureArray() 機能の現在だけを返します完成配列は、一見するとされてきていることから直観的です。

  • 何もないことは明らかであることから createClosureArray() が呼び出され一度に一つだけの範囲はこの機能を一つの代わりに毎に繰り返し処理のループを実行します。

  • この機能という名前の変数 index が定義されています。ループの行に追加します機能の配列を返す index.ご注意 index が定義されていますの createClosureArray 機能するのみが呼び出されます。

  • あったからで唯一の範囲内での createClosureArray() 機能 index は行き値にするとともに、その範囲.つまり、各時間のループの値を変更 index, で変化しているすべての参考にするとともに、その範囲.

  • すべての機能追加の配列を返し同じ index 変数から、親会社の範囲で定義ではなく10の異なるものから10種類のスコープのように最初の例です。このため、すべての10の機能を返し同じ変数と同じです。

  • プ後に終了し、 index を行った変更の値は10で毎に追加された機能の配列値を返しますシングル index 変数が設定10.

結果

閉鎖調査を実施してお
n=0
n=1
n=2
n=3
n=4
n=5
n=6
n=7
n=8
n=9

閉鎖を行い間違いに
n=10
n=10
n=10
n=10
n=10
n=10
n=10
n=10
n=10
n=10

Wikipedia止:

コンピュータ科学、閉鎖機能と環境を参照の非局所的名(無料変数についてはこの機能です。

技術的には、 JavaScript, これらの関数は閉鎖.いつでもアクセス変数を定義したその周辺です。

以降 範囲指定の建設に当サイトでは、以下のブラウザの機能, ではなく、コードブロックのような他の多くの言語 私たちは通常の意味 閉鎖 JavaScript機能と非局所変数が定義された既に実行されている周辺機能.

閉鎖はしばしば使用創造機能の一部の隠れた個人データが常に共通しているわけではない場合)。

var db = (function() {
    // Create a hidden object, which will hold the data
    // it's inaccessible from the outside.
    var data = {};

    // Make a function, which will provide some access to the data.
    return function(key, val) {
        if (val === undefined) { return data[key] } // Get
        else { return data[key] = val } // Set
    }
    // We are calling the anonymous surrounding function,
    // returning the above inner function, which is a closure.
})();

db('x')    // -> undefined
db('x', 1) // Set x to 1
db('x')    // -> 1
// It's impossible to access the data object itself.
// We are able to get or set individual it.

ems

上の例では匿名の機能は、実行されます。がんで頂ける方を探しています。での名前(例: mkdb や実行後の発生はデータベース機能でメソッドが呼び出されます。毎発生機能においても重要なのは、隠しデータベースオブジェクトです。他の使用例を閉鎖する場合は返却いたしませんの機能がオブジェクトを含む複数の機能を目的は様々ですが、それぞれの機能にアクセスと同じデータです。

私たち双方向JavaScriptのチュートリアルについて説明閉鎖。う閉鎖?

ここでの例:

var create = function (x) {
    var f = function () {
        return x; // We can refer to x here!
    };
    return f;
};
// 'create' takes one argument, creates a function

var g = create(42);
// g is a function that takes no arguments now

var y = g();
// y is 42 here

育つのを忘れずに、秘密いては、保護者の方も親して っています。この閉鎖います。

のためにJavaScript機能をプライベート変数

var parent = function() {
 var name = "Mary"; // secret
}

毎回はそれを呼び出すように、局所変数の名前を作成し、指定された名前の"マリア".毎時間の関数が終了の変数は失われ、名前は忘れられている。

しまうので、これらの変数は再作成時に関数が呼び出され、誰もいないものか知って、その秘密の場所が格納されています。できるという 秘密 または スタック または 地元の範囲 なった。いがあるのか、どこかに隠されたメモリの内容を消去します。

しかし、JavaScriptがあり、この特別なものにする機能の内部で作成されたその他の機能でも知る局所変数の両親保存されなければならないと参の上手続をしてください。

var parent = function() {
  var name = "Mary";
  var child = function(childName) {
    // I can also see that "name" is "Mary"
  }
}

なので、また、親会社機能までを一つ以上の子が機能しない共有の秘密の変数からの秘密の場所です。

が、悲しいことは、その子どもでも、民間変数にその親の機能でも金型の場合、親会社や営業秘密う金型です。

なので、子どもを残すもの

var parent = function() {
  var name = "Mary";
  var child = function(childName) {
    return "My name is " + childName  +", child of " + name; 
  }
  return child; // child leaves the parent ->
}
var child = parent(); // < - and here it is outside 

現在でもマリアはなくなり走行"、彼女の記憶が失われたと彼女の子ども忘れてはならない彼女の名前やその他の秘密な共有中の時間を過ごしました。

なので、お問い合わせいただいた場合の子"アリス"、その対応

child("Alice") => "My name is Alice, child of Mary"

ことになるすべてのがあります。

解できない理由回答複雑であります。

こちらは休業:

var a = 42;

function b() { return a; }

そうです。ほとんどの場合が多くあります。


ありませんしていると信じるに足る理由の閉鎖は、複雑なデザインhackドします。いや、閉鎖されていを用いる変数から高の範囲 の視点からの機能に宣言されていた(走行しません).

現在で を可能に だきますので、他の応答となります。

例のポイントdlaliberte:

閉鎖なたのお帰りの際に内部に機能です。実際、封入機能なしに戻ります。ばくを割り当て内側の機能を変数に外側の範囲、またはパスでの引数として機能することしてご利用ください。そのための閉鎖を包接機能しょうがすでに存在するのを包接機能のためには、内部機能へのアクセスなどと呼ばれています。

var i;
function foo(x) {
    var tmp = 3;
    i = function (y) {
        console.log(x + y + (++tmp));
    }
}
foo(2);
i(3);

閉鎖は、内部機能にアクセスできる変数がその外側の機能です。どれくらい簡単であることを説明できる抑止するためには、必要か

ないのでたっぷりの解決ことができるようになるこの小さくシンプルスクリプトの有効を発揮するコンセプト:

// makeSequencer will return a "sequencer" function
var makeSequencer = function() {
    var _count = 0; // not accessible outside this function
    var sequencer = function () {
        return _count++;
    }
    return sequencer;
}

var fnext = makeSequencer();
var v0 = fnext();     // v0 = 0;
var v1 = fnext();     // v1 = 1;
var vz = fnext._count // vz = undefined

いとしの素泊まりお招きました。をしないといけないと考えてい段を持XBoxコントローラです。

段を招いた。ダ求ポールを持つコントローラです。どのように多くのコントローラのためのパーティーを開催する。

function sleepOver(howManyControllersToBring) {

    var numberOfDansControllers = howManyControllersToBring;

    return function danInvitedPaul(numberOfPaulsControllers) {
        var totalControllers = numberOfDansControllers + numberOfPaulsControllers;
        return totalControllers;
    }
}

var howManyControllersToBring = 1;

var inviteDan = sleepOver(howManyControllersToBring);

// The only reason Paul was invited is because Dan was invited. 
// So we set Paul's invitation = Dan's invitation.

var danInvitedPaul = inviteDan(howManyControllersToBring);

alert("There were " + danInvitedPaul + " controllers brought to the party.");

JavaScriptの機能にアクセス:

  1. 引数
  2. 地元の人々は、そのローカル変数の機能を実装)
  3. 環境:
    • グローバル変数を含むDOM
    • 何も外側の機能

場合は機能アクセス環境は、機能があります。

注意外部機能を必要とせず、そのな特典をご用意しておいて。アクセスデータ環境閉鎖、常にそのデータを生きています。のsubcaseの外側/内部の機能では、外側の機能を創造できる現地のデータが口を出て、なる場合内部機能(s)生後の外側の機能を終了、その後の内部機能(s)の外側の機能のデータを生きています。

例の閉鎖を使用するグローバル環境:

そのスタックオーバーフロー投票、投票-タンと下へボタンイベントとして実施され閉鎖、voteUp_clickとvoteDown_click、リスク以外のリスク変数isVotedUpとisVotedDownは、定義されます。(簡単のための日本酒というStackOverflowの質問票のボタンではなく、配列の回答投票ボタンを押します。)

をユーザがクリックした際の飛びVoteUpボタンを押すと、voteUp_click機能があるかどうかを判isVotedDown==trueにするか否かを決議または単にキャンセルの下で行われた。機能voteUp_clickは閉鎖なのでアクセスします。

var isVotedUp = false;
var isVotedDown = false;

function voteUp_click() {
  if (isVotedUp)
    return;
  else if (isVotedDown)
    SetDownVote(false);
  else
    SetUpVote(true);
}

function voteDown_click() {
  if (isVotedDown)
    return;
  else if (isVotedUp)
    SetUpVote(false);
  else
    SetDownVote(true);
}

function SetUpVote(status) {
  isVotedUp = status;
  // Do some CSS stuff to Vote-Up button
}

function SetDownVote(status) {
  isVotedDown = status;
  // Do some CSS stuff to Vote-Down button
}

すべてのこれらの機能を閉鎖してすべてのアクセスを動画でご覧ください。

の著者 閉鎖 ついて説明して閉鎖か、を説明する理由を必要としているものを説明するLexicalEnvironmentに必要な理解を抑止するためには、必要か
こちらではの概要:

どの場合変数にアクセスがいいのか。ようこ:

Enter image description here

この場合、通訳者では、変数の 外 LexicalEnvironment オブジェクトです。

それから二つのステップ

  1. 最初に、関数fを作成し、作成された空 スペース。が現在のLexicalEnvironmentオブジェクトです。の場合 このウィンドウが未定義の機能 創造)

Enter image description here

関数を作成し、行動の便が良いことから、隠れた物件名"[[対象範囲]]を参照の現在のLexicalEnvironment.

Enter image description here

の場合変数の読み込みができないのでどこでも見つけることが出来、エラーが発生します。

入れ子の機能

機能は入れ子内部の他、チェーンのLexicalEnvironmentsでも呼び出すことができます範囲ます。

Enter image description here

なので、関数gのアクセスできるのg、およびf.

閉鎖

入れ子の機能があり暮らしを続けた後、外側の機能を終了した:

Enter image description here

マークアップLexicalEnvironments:

Enter image description here

として、 this.say 物件のユーザオブジェクトで生き続けてい後のユーザが完了します。

とだが this.say を作成しておりますがすべての機能)を得て、内部の基準 this.say.[[Scope]] 現在のLexicalEnvironment.そのLexicalEnvironment現在のユーザーの実行に滞在。すべての変数のユーザーまたはその性質なっていますので厳守、junkedしています。

ポイントをした場合には、内部機能したいアクセス外部変数をこの目で確かめることができるでいきます。

をまとめ:

  1. 内部機能の参照を保持し、外 LexicalEnvironment.
  2. 内部機能にアクセス変数からで って行われている場合でも、外側の機能を終了しました。
  3. のブラウザのLexicalEnvironmentとそのすべての特性(変数)までメモリ内の機能を参照します。

この呼びます。

父親として6年、現在の教え子(相対的な初心者に符号化することができませんの教育で修正する必要だと思うレッスンを堅持最じます。の場合は6歳がつかの閉鎖は、その年齢でいます。から貼り付け、コードをjsfiddle.net説明を少し、残っただけで振り返るなら!の説明文下にあり、10歳の時だ。

function sing(person) {

    var firstPart = "There was " + person + " who swallowed ";

    var fly = function() {
        var creature = "a fly";
        var result = "Perhaps she'll die";
        alert(firstPart + creature + "\n" + result);
    };

    var spider = function() {
        var creature = "a spider";
        var result = "that wiggled and jiggled and tickled inside her";
        alert(firstPart + creature + "\n" + result);
    };

    var bird = function() {
        var creature = "a bird";
        var result = "How absurd!";
        alert(firstPart + creature + "\n" + result);
    };

    var cat = function() {
        var creature = "a cat";
        var result = "Imagine That!";
        alert(firstPart + creature + "\n" + result);
    };

    fly();
    spider();
    bird();
    cat();
}

var person="an old lady";

sing(person);

指示

データ:データ集です。での数字が表示されているとき、言葉、測定、観察や説明にはなりえない。できないタッチで、香りや味わいです。できると言われている方、話し方で、ぜひ聞かせて下さい。でご利用いただけます~ の作成 タッチ香りと味覚を使用します。で利用することを可能にするコンピュータを用います。

コード:すべての文書で コード.では、JavaScriptで記述された.

JAVASCRIPT:当サイトでは、以下のブラウザです。英語やフランス語、中国語の言語である。多言語を理解してもらいコンピュータやその他の電子プロセッサです。JavaScriptを理解するためにコンピュータで通訳が同行します。想像の場合教師たちが語るロシア語を教えるクラス。時の先生は"все садятся"のクラスがない。もののいのロシアで生徒のクラスの人か皆様にこの"みんなり"です。このクラスは、コンピューターのように、ロシアの瞳は通訳です。JavaScriptの通訳と呼ばれるブラウザです。

ブラウザ:きインターネット接続にはパソコン、タブレットや電話でのウェブサイトを訪問し、ご利用のブラウザ.例えばインターネットExplorer、google Chrome、Firefoxとサファリがあります。のブラウザが理解できるJavaScriptのコンピュータに何が必要です。JavaScriptの指示といいます。

機能:機能に当サイトでは、以下のブラウザのような工場です。ですが、少し工場でひとつだけの機械です。でも多く含まれるものがありますので少し工場、多くの機械がやって異なる。実生活の洋服工場が連のロボビンのスレッドなどの見Tシャツやジーンズをアピールします。当社のJavaScript工場プロセスだけでな縫うように、ドリル穴または溶融金属です。当社のJavaScript工場のデータがデータをつける事が出来ます。●

すべてこのデータもこのバンドボーリングでも非常に涼;その機能を伝えるロボットに何を作ります。ということかと誘います友達に私の実家で暮らしました。好きな鶏の足は、私のようなソーセージ、ご友人もいたの思いと私の友人はんを食べないお肉になります。

い時間にショッピングの機能を知る必要のない冷蔵庫の決定.各成分が異なる調理時間にしたいと思っているもの温によるロボットも同時に行います。提供する必要も出てくる機能のデータをお客様のために私たちのように機能することができる話、冷蔵庫、機能を制御できるロボットです。

機能は通常、氏名、括弧で、ブレース.このように:

function cookMeal() {  /*  STUFF INSIDE THE FUNCTION  */  }

ご注意 /*...*/// ストップコード読まれのブランド、、、。

名前:話ができる機能だけでその単語ます。の例"cookMeal"で典型的である当社では豊富な種類の言葉とを第一の資本書の冒頭では入力する必要はありません。することはできないスペースではできなくなる番号です。

括弧:"括弧内は () の文字ボックスのJavaScript関数の工場の扉を受けた後、ボックスにパケットを送信するための、情報。あのポストが目印になる 例えば、 cookMeal(you, me, yourFriend, myFriend, fridge, dinnerTime), り、その場合、システムについてのデータを教えていただけると嬉しいです。

ブレース:"ブレース"に見えるのがこの {} の色windowsの工場です。内部からの工場ではなく、外部からのだ。

のコード例では、上記

当社のコードで始まる単語 機能, いかがですか!その名称機能 -これはまさに私にぴったりの自分のように機能する。その後の括弧内 ().の括弧は常にあります。も空いています。この言葉: (person).この後がブレースのようなこ { .このマークの機能 歌().このパートナーの終了をマークし 歌() このような }

function sing(person) {  /* STUFF INSIDE THE FUNCTION */  }

この機能がい歌を歌ったり、必要なデータをいいます。この指示の内側にいるデータです。

今後の機能 歌(), 近くにはコードのライン

var person="an old lady";

変数:の文字 var スタンド"の変数.可変するようにして同封してください。の外でこの封筒には"る"というものです。の内部でスリップ用紙の情報は当社の機能、一部の文字やスペース社との文字列(もと呼ばれる文字列)を作る"とい読める"女性".当社の封筒が含まれる場合があるためその他のダやココロはいろいろなことのように番号(整数型)、指示書と呼ばれる機能)、リストと呼ばれる 配列).この変数は社外のすべてのブレース {}, できれているということもあり、比較を通じて色windows場内のブレース、この変数がどこからでも、コードです。これは"グローバル変数'.

グローバル変数: はグローバル変数の意味が変更された場合、その値から"女性"と"人"の 続けている若い男性で決まりましたしていることから、再度の変更やその他の機能のコードで参照されるとのことです。を押して、 F12 ボタンのオプションの設定を開ける開発コンソールブラウザのタイプは"人"が見どこの値です。タイプ person="a young man" で、その種類は"人"が再び見ることが変わりました。

後には、我々にとってのライン

sing(person);

ウルトラカットシリーズは、この関数を呼び出して、その場で話犬

"Come on , において、取得し !"

時のブラウザが読み込まれると、JavaScriptのコードは、ここでの機能です。入れる線の終了させることによってブラウザのすべての情報ニーズを実行します。

機能の定義の行動の主な機能はあります。も含まれ変数と呼ばれ firstPart 適用される、歌の人に適用されるそれぞれの詩に曲:"あした"+人+"who飲み込んだ".した場合 firstPart のコンソールとなってお答えでの変数が固定されてしまった関数のブラウザで見えない内部の窓ガラスにフィのブレース.

閉鎖:クロージャには小さな機能の大きな 歌() 機能です。の工場内には大きな工場です。それぞれ独自のブレースということになり、その変数の内側にできないからです。その名前の変数(生き物結果)繰り返すことができますので、閉鎖が異なる値です。場合は、これらの変数の名前コンソールウィンドウを非表示になってその価値で隠れる二層の色です。

を閉鎖すべてのかを 歌() 機能の変数と呼ばれ firstPart はないので、できれているということもあり、比較からその色です。

後の閉鎖にライン

fly();
spider();
bird();
cat();

をお楽しみください()関数を呼これらの各機能に与えられます。しをお楽しみください()関数の作業が行われることになります。

大丈夫から6歳の子ども、私が利用会

想像されるようお願いします遊びを利用することで、兄弟姉妹の一方で、移動のおおもちゃとらのしお兄さんのお部屋です。しばらくお兄から返されたの学校にやって住所変更は必ず不動産査定部、ロックの中で、今までのアクセスできない玩具がなくなっ直接ます。だけどノックのお兄弟たちです。これ玩具 閉鎖;ご兄弟製することができますが、現在は外 範囲.

を比較しい状況の場合はドアがロックされたように、誰もいない内(一般機能の実行、そして一部の地域に火災が発生し、燃焼のム(ガベージコレクタ:D)、そして新しいムの構築や取り外す必要はありません別の玩具が新機能のインスタンス)がんと同じ玩具に残された最初の部屋インスタンス.

先端子のいいものは下記のようになっています。では完全というわけではありませんが、いつかは:

function playingInBrothersRoom (withToys) {
  // We closure toys which we played in the brother's room. When he come back and lock the door
  // your brother is supposed to be into the outer [[scope]] object now. Thanks god you could communicate with him.
  var closureToys = withToys || [],
      returnToy, countIt, toy; // Just another closure helpers, for brother's inner use.

  var brotherGivesToyBack = function (toy) {
    // New request. There is not yet closureToys on brother's hand yet. Give him a time.
    returnToy = null;
    if (toy && closureToys.length > 0) { // If we ask for a specific toy, the brother is going to search for it.

      for ( countIt = closureToys.length; countIt; countIt--) {
        if (closureToys[countIt - 1] == toy) {
          returnToy = 'Take your ' + closureToys.splice(countIt - 1, 1) + ', little boy!';
          break;
        }
      }
      returnToy = returnToy || 'Hey, I could not find any ' + toy + ' here. Look for it in another room.';
    }
    else if (closureToys.length > 0) { // Otherwise, just give back everything he has in the room.
      returnToy = 'Behold! ' + closureToys.join(', ') + '.';
      closureToys = [];
    }
    else {
      returnToy = 'Hey, lil shrimp, I gave you everything!';
    }
    console.log(returnToy);
  }
  return brotherGivesToyBack;
}
// You are playing in the house, including the brother's room.
var toys = ['teddybear', 'car', 'jumpingrope'],
    askBrotherForClosuredToy = playingInBrothersRoom(toys);

// The door is locked, and the brother came from the school. You could not cheat and take it out directly.
console.log(askBrotherForClosuredToy.closureToys); // Undefined

// But you could ask your brother politely, to give it back.
askBrotherForClosuredToy('teddybear'); // Hooray, here it is, teddybear
askBrotherForClosuredToy('ball'); // The brother would not be able to find it.
askBrotherForClosuredToy(); // The brother gives you all the rest
askBrotherForClosuredToy(); // Nothing left in there

ご覧のとおり、玩具にルームもアクセスを兄さんにしていない場合、ロックされています。こちらは a jsbin 遊びにきます。

回答のための六歳(という機能は、何の変数は、データ):

機能を返します。一種類のデータに戻すことができからの機能は他の機能です。きる新しい機能が返される、すべての変数および引数を使用する機能に作成されません。代わりに、親機能"をお選びいただけます。" その他の言葉ですが、見てみようでは変数で使用以外の機能が返されます。この新しい機能は特別な能力を振り返内の関数を作成したものデータをすることが重要です。

function the_closure() {
  var x = 4;
  return function () {
    return x; // Here, we look back inside the_closure for the value of x
  }
}

var myFn = the_closure();
myFn(); //=> 4

も本当に簡単に説明ではその範囲:

任意の時間をより狭い範囲内の大きな範囲の小さい範囲を常に見ることができあがる。

機能に当サイトでは、以下のブラウザで参照しの指示としてC言語でも隠しデータ構造で構成される参照はすべての非局所的変数を使用す(撮影変数).この図のような作られる機能を抑止するためには、必要か各機能でJavaScriptのと見なすことができます。

クロージャと一緒に機能します。でも同様に"今"を感じる"この"も状態の機能が機能"本"は別々のオブジェクト("本"はただの仮パラメータにバインドされた永久機能を閉鎖).ながら"この機能は常に生きには別途、機能するものではありませんからの閉鎖および言語の提供を通アクセス像の変数.

でこれらすべての外部変数の参照により語彙的に小入れ子の機能を実際にローカル変数のチェーンの語彙的に小囲の機能(グローバル変数できるものとする局所変数のルート機能)、シングル実行機能の新しいインスタンスのローカル変数、ということで毎の実行機能に帰国(又はその他の譲渡すなど、登録してコールバック) 入れ子の機能を新たに生成しますの閉鎖自身の潜在的な設定の参照される非局所的変数を表す実行コンテキスト).

ものであることを理解する必要ローカル変数にJavaScriptを作成しませんのスタックフレームがヒープの破壊しただけない場合は参照します。場合は、関数が返すだけでなく、その地域変数は減が可能でnullでない場合は、当実行った部分とともに、いまだによって参照されるその語彙的に小入れ子の機能な場合にのみ参照はこれらの入れ子の機能とされ、又は一部を外部コードとします。

例:

function foo (initValue) {
   //This variable is not destroyed when the foo function exits.
   //It is 'captured' by the two nested functions returned below.
   var value = initValue;

   //Note that the two returned functions are created right now.
   //If the foo function is called again, it will return
   //new functions referencing a different 'value' variable.
   return {
       getValue: function () { return value; },
       setValue: function (newValue) { value = newValue; }
   }
}

function bar () {
    //foo sets its local variable 'value' to 5 and returns an object with
    //two functions still referencing that local variable
    var obj = foo(5);

    //Extracting functions just to show that no 'this' is involved here
    var getValue = obj.getValue;
    var setValue = obj.setValue;

    alert(getValue()); //Displays 5
    setValue(10);
    alert(getValue()); //Displays 10

    //At this point getValue and setValue functions are destroyed
    //(in reality they are destroyed at the next iteration of the garbage collector).
    //The local variable 'value' in the foo is no longer referenced by
    //anything and is destroyed too.
}

bar();

ょうかこれを超えてすべてが最も早六歳の方でも数例しか事例がこの概念を閉JavaScriptをクリックします。

閉鎖機能とアクセスできる他の機能の範囲(その変数と関数).最も簡単な方法を知ることができる。機能を内の機能その理由をわけることができるJavaScriptの機能にはアクセスを含むその機能の範囲におい

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        alert(outerVar);
    }
    
    innerFunction();
}

outerFunction();

アラート:猿

上記の例では、outerFunctionと呼ばれる通話innerFunction.注どのようouterVarはinnerFunctionなど、その正しい知の値outerVar.

現在は、以下を勘案します。

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        return outerVar;
    }
    
    return innerFunction;
}

var referenceToInnerFunction = outerFunction();
alert(referenceToInnerFunction());

アラート:猿

referenceToInnerFunction設定outerFunction()は、単なる参照を返しまinnerFunction.時referenceToInnerFunction"と呼ばれるものを返しますouterVar.再度上記のように、このようにinnerFunctionアクセスできるのouterVar変数のouterFunction.また、興味深いことにするものではなくこのアクセスもouterFunction終了した。

と、ここはどこで取り上げるべきだったんですよね。まったくouterFunction、これをnullに設定しいと思うかもしれreferenceToInnerFunctionうゆったり、その値へのアクセスのouterVar.でも実際はそうではありません。

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        return outerVar;
    }
    
    return innerFunction;
}

var referenceToInnerFunction = outerFunction();
alert(referenceToInnerFunction());

outerFunction = null;
alert(referenceToInnerFunction());

アラート:猿 アラート:猿

がどのようにこんでいます。どのようにreferenceToInnerFunctionまだノウハウなどをアドバイスouterVarるouterFunctionに設定されているnull?

こreferenceToInnerFunctionでもアクセスに価値のouterVarた場合に閉鎖した最初の作成をinnerFunction内outerFunction,innerFunction追加の参照outerFunctionの範囲(その変数と関数)をその範囲ます。ことができるようになinnerFunctionはポインタを参照するすべてのouterFunctionの変数を含むouterVar.どうしてもouterFunctionの実行が終了した場合でも削除設定がnullの場合、変数はその範囲は、outerVar、スティック周辺の記憶に残高を参照しているのinnerFunctionて返されるreferenceToInnerFunction.真のリリースouterVarのouterFunctionの変数はメモリからいくこ残高を参照し、設定referenceToInnerFunctionをnullにしています。

//////////

二つい止めます。第一に、閉鎖は常にアクセスの終値のを含む。

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        alert(outerVar);
    }
    
    outerVar = "gorilla";

    innerFunction();
}

outerFunction();

アラート:ゴリラ

第二に、閉鎖を作成するものではなく参考にすべてを包接機能の変数および機能でんを選びます。ですので、閉鎖さ控えめに使用され、少なくとも厳選されたメモリの集中;多くの変数にてお預かりさせて頂いておりまメモリーを含む機能が完成。

私は単に点を Mozillaのページを閉鎖.朝食も普通に美味しいです。、 簡便かつ簡潔な説明 開閉式の基礎と実際の使用と思います。することをお勧め誰でも学習が可能です。

あり、私もお勧めで6歳になる--の場合は6歳で学ぶ閉鎖、その論理的な彼らを理解の 簡便かつ簡潔な説明 の提供となります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top