-2
i = 3;
j = 2;

function domath(x) {
    i = 4;
    j = 1;
    return i*x + j;
}

j = domath(i) - j;
alert(j); //expected result = 11

k = domath(i) + j;
alert(k); //expected result = 15

上記の JavaScript コードは、(コード内のコメントで示されているように) 期待される結果を返しません。私のためにコードを修正してください。

4

5 に答える 5

3

を使用していないvarため、変数ij最初の行で定義している変数は、実際には関数で定義した変数と同じですdomath()...

これを試して :

i = 3;
j = 2;

function domath(x) {
    var i = 4;
    var j = 1;
    return i*x + j;
}

j = domath(i) - j;
alert(j); //expected result = 11

k = domath(i) + j;
alert(k); //expected result = 15

PS : コードを読みやすくするために、変数名を変更することをお勧めします。

于 2013-04-24T09:53:14.953 に答える
1

次を使用して変数を宣言しますvar

var i = 3;
var j = 2;

function domath(x) {
  var i = 4;
  var j = 1;
  return i * x + j;
}
于 2013-04-24T09:52:47.367 に答える
0

問題は、グローバル変数を上書きしていることです。つまり、数学を台無しにしています。

j = domath(i) - j;

この式は左から右に評価されます。を呼び出すととdomath()に新しい値が割り当てられるため、ここでの効果的なコードは次のようになります。ij

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()ます。ij

j = 4 * 3 + 1 - 2

これが完了jすると、期待どおりに設定さ11れます。


このような問題を回避するには、新しい変数を定義するときに常に使用varすることをお勧めします (とにかくコードを記述したい場合はこれを行う必要がありますstrict)。そのような短くてわかりにくい変数名は使用しないでください。1 文字の変数名の使用をイテレータやその他のスコープが非常に限定されたものに制限することを検討します。何かがグローバルであることは決してありません。

于 2013-04-24T09:56:52.343 に答える
0

物事を行うには本当に厄介な方法のようです。

私は個人的に次のようなことをします:

var v1;
var v2;

function math(x){ //do math here then return}
alert(math(1))

少なくともどこでも同じ変数を使用する必要がある場合は、次のようにします。

var i = 3;
var j = 2;

function domath(x) {
var i = 4;
var j = 1;
return i*x + j;
}

また、変数名を意味のあるものにすることで、正しい軌道に乗ることができます。また、グローバルではなく var を使用することも役立ちます。

于 2013-04-24T09:52:30.720 に答える