2017-11-02 8 views
0

私はjsbinを作って、何を意味するのかを実証しました。なぜ集会を数えますか?私は関数のすべての呼び出しで、すべての内部変数がリセットされます。Javascript - すべてのコールでこの関数の値がリセットされないのはなぜですか?

http://jsbin.com/kilonepece/edit?html,js,console,output

function test(text) { 
    var count = 0; 

    return function() { 
    console.log(text + ' ' + count); 
    count++; 
    } 
} 

document.getElementById('button').addEventListener('click', test('clicked')); 

これは、コンソールに、このログに記録されたことになります。

は "0をクリックし、" "1クリック" "2をクリックした" "3をクリックし、"

+1

'count'がテスト'への各呼び出しで '0'に設定されている() 'あなたは、ここではないjsfiddleをあなたのマークアップとコードをポストするために必要とされている – guest271314

+1

。 [mcve]フィヨルドはあなたの例を褒めることができますが、その代わりに使用することはできません。 – Rob

+2

'count'は無名関数の外部にあります。 –

答えて

2

ので、あなたはtestcountがリセットされますを起動するたびに "4をクリックしました"。あなたがやっているのは、testを一度呼び出して、返された関数をイベントハンドラとして割り当てることです。これは、countのイベントハンドラが0の値を持つようにしてから、クリックごとにその値をインクリメントします。

countは、クロージャの「内部」変数ではなく、ただ1回だけ呼び出す関数testに限られます。

-1

これは常にリセットする必要があります。以下試してください:

function test(text) { 
    var count = 0; 
    return function() { 
    console.log(text + ' ' + count); 
    count++; 
}() 
} 
document.getElementById('button').addEventListener('click', test('clicked')); 
+1

これは、内部関数を1回(ページが読み込まれたとき)実行してから、クリックハンドラを「未定義」に設定します。 – David

+0

ボタン要素をクリックしたり呼び出さずにページが読み込まれたときに、内部関数を呼び出す方法はありますか? –

+0

外部関数の 'return'ステートメントの最後に括弧を追加したためです。括弧*は関数を実行します。だから、 'test()'の戻り値は内部関数の戻り値で、何も返されません。 (だから、 'undefined')あなたのコードをテストして見てください。 – David

関連する問題