2013-07-06 6 views
5

私はJavascriptで可変スコープを理解しようとしています。ここで私はやっているものです:javascript:ブロック内の変数をローカライズ

<script> 
for (var i = 0; i < 3; i++) { 
    document.getElementById(i).onclick = function() { 
    console.log(i); 
    } 
} 
</script> 

出力は常に3である、と私はiは、参照によって保持されているので、それはです理解しています。 iをどのようにローカライズすれば増分値を記録できるのですか?

ありがとうございます!迅速でまともな応答のための

更新

みんなありがとう。ソリューションは確かに助けになります!

<script> 
for (var i = 1; i <= 3; i++) { 
    document.getElementById(i).onclick = function() { 
     console.log(logCall(i)); 
    } 
} 
function logCall(i) { 
    return i; 
} 
</script> 

をしかし、それはローカライズされていないiのようになります。

当初、私はここにある、@GrailsGuyと同様のアプローチをしようとしていました。理由を理解できません!

+0

それはonclickのイベントとは何かを持っていますか?ユーザーが一度だけクリックすると、どのようにオンクリックをループすることができますか?そして、あなたはlogCall()関数が必要ですか? console.log(i)と同じではないでしょうか? – oobie11

+0

編集に関しては、最初の例と同じ問題です。イベントハンドラ内で 'console.log(i)'または 'superlongandconfusingfunctionname(i)'を持っているかどうかは違いはありません。ループ終了後に 'i'にアクセスしようとしています。 –

答えて

7

新しいスコープを作成します

for (var i = 0; i < 3; i++) { 
    (function(i) { 
    document.getElementById(i).onclick = function() { 
     console.log(i); 
    } 
    }(i)); 
} 
2

Javascriptでは、スコープは大カッコでは作成されません(Cのような構文とは異なります)。スコープは、関数で作成された、しかしので、一方向関数(更新)に呼び出しを抽出することである。

<script> 
for (var i = 0; i < 3; i++) { 
    logCall(i); 
} 

function logCall(i) { 
    document.getElementById(i).onclick = function() { 
     console.log(i); 
    } 
} 
</script> 

このもう少し再利用可能なコードを作成する追加の利点を有しています。

+0

なぜdownvote? – Igor

+0

私はdownvoteしませんでしたが、あなたのコードは何も解決しません。 – Prinzhorn

+1

これは間違っています。http://jsfiddle.net/GaCPv/ – Musa

関連する問題