2016-04-24 12 views
0

私が理解しているように、クロージャは、関数とパラメータを関数の外部にリンクし、関数内のものがその関数にアクセスできるようにする環境を作ります。なぜクロージャ環境で変数の宣言が機能しませんでしたか?

以下は、クロージャ付きの関数です。私はこの機能を3回実行します。私は実行たびに追加ので、私は()、1を取得する必要があり、それは0としてカウンタを再宣言し、1を追加することを期待

add(); 
add(); 
add(); 

だから、カウンタ= 0、カウンタ++、カウンタ= 0、カウンタ++、カウンターでなければなりません= 0、カウンタ++。しかし、なぜそれがであることが判明しましたか?

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

function myFunction(){ 
    document.getElementById("demo").innerHTML = add(); 
} 

2番目の質問は次のとおりです。

variable = (function() {})() 

我々は関数の後に機能を囲むために、余分な括弧を追加し、なぜ別の余分な括弧のはなぜ?

ありがとうございます!

答えて

3

私は実行たびに追加ので、私は()、1を取得する必要があり、それは0としてカウンタを再宣言し、1

いや、正確ではないが追加されます期待しています。 addは、の機能を指し、にを返します。あなたがaddを呼び出すと、単にcounter1を追加することになりまし参照ください

enter image description here

、何も:この機能は、counterだけaddをログに記録し、それを見てましょ

0に設定しませんそれ以外は?

機能を抽出すると、コードがわかりやすくなることがあります。あなたはcreateAddが(したがってラインvar counter = 0)は1回だけ実行されますが、機能が複数回実行されるcreateAddからを返されていることがわかります

ここ
function createAdd() { 
    var counter = 0; 
    return function() {return counter += 1;} 
} 

// we are *calling* createAdd here, so `add` refers 
// to the function defined in line 3 (function() {return counter += 1;}) 
var add = createAdd(); 

add(); 
add(); 
add(); 

:次のコードは、あなたとまったく同じ結果になります。

なぜ、関数を囲む余分な括弧を追加するのですか?関数の後ろに余分な括弧があるのはなぜですか?

これは、(IIFE)という直後に呼び出されると呼ばれます。それは関数を定義し、すぐにそれを実行します。これは多くの場合、変数の範囲を制限するために行われます(この場合はcounter)。

あなたは生命維持には1つだけの式に関数の宣言と実行を置く

function f() {} 
(f()) 

(function() {}())が等価であると考えることができます。これにより、スコープを汚染しないように関数名を省略することができます。

関連質問:


閉鎖環境での変数の宣言が機能しなかったのはなぜ?

私はそれが意図したとおりに正しく動作すると言います。

+0

申し訳ありませんが、私は理解していない関数は行ごとに実行する必要はありませんか? addが呼び出されるたびに、var 'counter = 0'を実行し、' return'を正しく実行する必要がありますか? –

+1

* "関数は行単位で実行するべきではありません" *もちろんです。 *「追加が呼び出されるたびに、実行する必要があります...」*いいえ、私が答えで説明したように、*「追加」はIIFEから**返されている**関数を指します。 function(){return counter + = 1;} '。*私はいくつかの情報を追加しました。また、 'console.log(add)'を実行し、 'add'の値が何であるかを見ることもできます。 –

+0

詳細な説明をありがとう!私はそれを試してみよう〜 –

関連する問題