2016-06-16 21 views
3

誰でもこのメッセージがの代わりに11を記録する理由を教えていただけますか?JavaScriptループが予期せぬ結果を返します

function foo() { 
    function bar(a) {   
    i =3; 
    console.log(a + i);  
    } 

    for (var i=0; i<10; i++) { 
    bar(i *2); 
    //I know, infinite loop 
    } 
} 

foo(); 

ibar(){}にハードコードされている場合は、ログインしてその結果が9すべきではありませんか?

これはScopeクラスの一部であり、私は紛失しています。

ありがとうございました。

+0

おそらく 'i'が' bar'関数と 'for'ループの両方で使われていますか? –

+1

@Rocketは、 'foo()'の先頭に 'i'の巻き上げを見逃しました。 –

+0

はい、var i = 3と宣言して固定しました。代わりに。 –

答えて

6

最初の反復において、iは、0であり、10より小さい。 02 * i)はaからbarに渡されます。 i3に設定されると、合計は3になります。その後、次の反復において

i(静止10よりも小さい)4にインクリメントされるが、8は(2 * ibarからaとして渡されます。 i3にリセットされた場合、合計は11になります。

次の反復は同じであり、i3から4に再度増加します。

iが変更されたため、最初に乗算が評価されているため、誤った解釈はaの値が変わらないようです。または、ループヘッダーのi++ステートメントを見逃しました。

+2

私は、彼が本当に「3」になると思っていたので、彼が立ち往生した部分(と私は理由を理解することができます)が本当にあると信じています。 –

+0

はい、@Stephan、それは私が思ったことです。また、無限ループを修正するために、var i = 3と宣言しました。代わりに。 –

+0

ありがとう、@ベルギー、それだけです。今は理にかなっている。 –

1

@Bergiには正しい答えがあります。ちょっと拡大したいだけです。文字列や数値などのプリミティブ型の場合、パラメータは値渡しになります。ここでは、iを値aとしてバーに渡します。 iまたはaの変更は、他方の値には影響しません。この場合、iの値が[0,4,5,6,7,8,9]であるため、これも無限ループになりません。

ここで、渡されたオブジェクトの中にラップされた場合あなたはあなたが尋ねている問題を抱えているでしょう。 javascript関数に渡されるオブジェクトは参照渡しされるので、barのオブジェクトへの変更もfooで起こります。

関連する問題