2012-11-21 16 views
5

私が読んだ記事ほど多くの質問が残っています。Javascript Closure Clarification?

  1. 悪名高いループ問題(保持数とそれらの一つ一つに、アラートとのリンクのループ)

  2. 私はすでにのような閉鎖の使い方を知っている(と理解します)

    カウンタが増加しました(増加した数値を警告する関数を呼び出してください)

:その外側関数 のローカル変数を参照

内側機能hereから

クロージャを作成する:

クロージャは関数のローカル変数であります - 関数が返された後で生きているか、クロージャがスタックフレームでない場合 割り当て解除関数が返ってきたらd。 (「スタック・フレーム」かのよう ではなく、スタック上にあるのでmallocた!)

3の質問をしてください。

質問#1

私はすべてのことを言われましたJSの関数はクロージャを作成します。

WHAT ???プライベート変数を持つ通常の関数を作成すると、スコープが作成されます。閉鎖ではない。

私はこの:(from hereようなその閉鎖作業と思った)

  1. 外側の、 "機能メーカー" 機能を確認します。
  2. その内部にローカル変数を宣言します。
  3. 内側の関数を外側の関数の内側に宣言します。
  4. 内部関数内の外部関数の変数を使用します。

    function functionMaker(){ 
        var x = 1; 
        function innerFunction(){ 
        alert(x); 
        x++; 
        } 
        return innerFunction; 
    } 
    

    は、なぜ彼らは言う:

  5. は、外側の関数は、関数を実行し、内部機能
  6. を返し、変数

exmampleにその戻り値を代入持っていますすべてのjs関数はクロージャを作成しますか?Immediately Invoked Function Expressionクロージャを作成する -

質問#2

Self-Invoking Functions別名IEFAしていますか?

上から6ルールのようなパターンが表示されていない

(function (a) { 
    alert(a); 
})(4); 

私を見て:Have the outer function return the inner functionがここにある場所を正確に ?私は単語returnを見ない。

質問#3

function myFunction() { 
  var myVar = 1; 
  var alertMyVar = function() { 
    alert('My variable has the value ' + myVar); 
  }; 
  setTimeout(alertMyVar, 1000 * 3600 * 24); 
} 
myFunction(); 

myFunctionは、ここでは一日のために生きていましたか?またはsetTimeoutの直後に終了しましたか?もしそうなら、どのようにSetTimeOutが記憶されたのですか?その値は?

私はそれを正しくする手助けをしてください。

答えて

8

すべての機能を呼び出してクロージャを作成します。注目すべき重要な点は、クロージャが関数呼び出しの存続期間を超えて持続するかどうかです。

私はすぐに、実行された機能を行う場合:その後、クロージャが作成され

var value = (function() { 
    return 4; 
})(); 

が、廃棄された機能に戻ります。どうして?クロージャーで定義されたシンボルへの参照は残っていないためです。しかし、ここで:それは順番に、元の関数で定義された「カウンター」のシンボルへの参照が含まれ、機能を返すため

var value = function() { 
    var counter = 0; 
    return function() { 
    return counter++; 
    }; 
}(); 

閉鎖は、すぐに実行された機能の後に住んでいます。返された関数は "生きている"ため、ランタイムシステムによってクロージャを保持する必要があります。ここ

注:

外すぐに実行された機能は、関数を返すにもかかわらず、
var value = function() { 
    return function(a) { 
    return "hello " + a; 
    }; 
}(); 

は、その関数が外側のものから任意のシンボルを参照しないので、閉鎖を維持する必要はありません。

私が言っていることは、厳密に静的で構造的なものではなく、関数を実行する効果の一部としてクロージャを考えることが役立つと思います。 時にはが永続クロージャを作成する機能を持つことは可能ですが、必ずしもそうではありません。

+0

ありがとうございました。それは私の3番目の質問に関連していますか? '関数呼び出しの寿命を超えて'? –

+0

忘れないでください:JavaScript IIFEにはかっこが必要です。 '(function(){})();' –

+2

@WaleedKhanいいえ、そうではありません。 'function'キーワードをあいまいにするだけでいいです。 '= '式の右辺にはあいまいさがないので、かっこは必要ありません。 – Pointy