問題は、グローバル変数を上書きしていることです。つまり、数学を台無しにしています。
j = domath(i) - j;
この式は左から右に評価されます。を呼び出すととdomath()
に新しい値が割り当てられるため、ここでの効果的なコードは次のようになります。i
j
j = (i = 4) * 3 + 1 - 1;
したがって、これが完了すると、j
が に設定されますが12
、実際には ではありません11
。さらに、i
の値を持ちます4
。
関数内でローカル変数を使用するには、それらを再宣言する必要があります。基本的に、このスコープ外にあるグローバル変数を非表示にします。
function domath(x) {
var i = 4;
var j = 1;
return i * x + j;
}
今回は、最初の割り当てはこれに解決されdomath()
ます。i
j
j = 4 * 3 + 1 - 2
これが完了j
すると、期待どおりに設定さ11
れます。
このような問題を回避するには、新しい変数を定義するときに常に使用var
することをお勧めします (とにかくコードを記述したい場合はこれを行う必要がありますstrict
)。そのような短くてわかりにくい変数名は使用しないでください。1 文字の変数名の使用をイテレータやその他のスコープが非常に限定されたものに制限することを検討します。何かがグローバルであることは決してありません。