2017-12-03 17 views
0

渡されたパラメータの値を変更します以下のように:変数は、私は以下のようにJavaScript関数を持っている

for (x = 0; x < 10; x++) { 
 
    console.log(modifyx(x)); 
 
}

予想される出力は "11"で10回印刷されますが、代わりに1回印刷されます。関数呼び出しは、渡された値を変更していないのにx eventの値を変更します。関数内のxには独自のスコープがあります。しかしそれは変更されます。これに関する助言は高く評価されます。

+0

関数呼び出しに 'X'を渡すの目的は何ですか、あなたは(modifyx 'で' xvalue'を使用することはありません) ' – NewToJS

+0

これはあくまでも一例です。実際には私の関数内で "readonly"として値を使用しています。問題はなぜ起こっているのでしょうか? –

+0

私は単にあなたが達成したいことをより良く理解しようとしていますが、私はあなたの質問をより良く理解しています。 **あなたが出力を得ている理由を知りたいだけです。 – NewToJS

答えて

2

コード内の変数xglobalです。あなたのメソッドmodifyx(xvalue)が最初に返されるとき、xの値は既に11であり、それは第2の反復のforループで使用されます。したがって、この方法をさらに実行することはできません。

宣言でlet xfor (x = 0; x < 10; x++)に使用すると、一意の実行環境を作成できます。

function modifyx(xvalue) { 
 
    val = 1; 
 
    for (x = 0; x < 10; x++) { 
 
    val = val + 1; 
 
    } 
 
    return val; 
 
} 
 

 
for (let x = 0; x < 10; x++) { 
 
    console.log(modifyx(x)); 
 
}

+0

ありがとう!!私は実際に不安を覚えていて、この小さな間違いを認識しませんでした。 –

+0

@BILALAHMAD、あなたは大歓迎です。 – Mamun

2

ちょうどあなたのコード内でグローバル変数としてその撮影のxため、ループ

function modifyx(xvalue) { 
    val = 1; 
    for (var x = 0; x < 10; x++) { 
    val = val + 1; 
    } 
    return val; 
} 

for (var x = 0; x < 10; x++) { 
    console.log(modifyx(x)); 
} 

のために両方の場所でVARを置きます。 JavaScriptで変数のスコープの

+0

私は最後の行rightで説明しました。グローバル変数としてxを取っています。内側の関数内部のxは10回ループし、関数外のループは終了します。xは同じxなのでxの値は10になるので終了します。 – saiyan

0

MDSNのドキュメント:グローバルとローカル:

JavaScriptが2つのスコープを持っています。関数定義の外で宣言された の変数はグローバル変数で、その の値はプログラム全体でアクセス可能で変更可能です。関数定義内で宣言された変数 はローカルです。それは を作成し、機能がvarキーワードを使用する場合は、変数の宣言がそれのスコープ(関数)の先頭に引っ張られ


を実行されるたびに破壊されます。

例コードでは、を定義しないでのループを使用しています。var xです。 for (x = 0...を使用すると、ブラウザはfor (var x = 0...を意味すると見なして、xというグローバル変数を作成します。

modifyxの内部では、グローバルxを実行終了時に11に設定しています。これにより、外側のループが1回だけ実行されます。これは、最初のループの後にxが10よりも小さくなっていないためです。ここで


はコメントで何が起こっているかの例です:

function modifyx(xvalue) { 
    val = 1; 
    for (x = 0; x < 10; x++) { // sets the global 'x' to 11 after loop finishes 
     val = val + 1; 
    } 
    return val; 
} 

// 'x' is being defined as a global variable 
for (x = 0; x < 10; x++) { 
    console.log(modifyx(x)); // modifyx sets 'x' to 11 
    // x is now 11, loop will now quit 
} 

簡単な解決策は、このように範囲を制限する、両方のループでletキーワードを使用することです。

for (let x = 0; x < 10; x++) { ... } 
関連する問題