2016-03-21 7 views
2

以下JSコードは奇妙に振る舞う:パラメータが関数の外で値を保持しないのはなぜですか?

var c = 0; 
var a = 0; 
myTest(8, 5); 

function myTest(a,b) { 
    console.log(a); 
    a++; 
    c++; 
    console.log(a); 
    return a; 
} 

console.log(a); 
console.log(c); 

https://jsfiddle.net/hwns1v4L/

Iの関数のうち「」パラメータ1によって「」インクリメントと第三のコンソール・ログ・リターンを取る場合は「」として1.完全に正常です。しかし、 "a"を(上記のコードのように)myTest関数のパラメータとして保持すると、値は8になり、1から9までインクリメントされ、3番目のコンソールログは0を返します。

この奇妙な動作の説明は何ですか?これが別のスレッドで説明されていればごめんなさい。私はJSが本当に良いGoogleクエリを生成したり、高度な答えを理解するにはあまりにも新しいです。

+0

JavaScriptは、他のほとんどの言語と同様に、値渡しです。この「奇妙な」行動は非常に一般的です。 https://en.m.wikipedia.org/wiki/Evaluation_strategy –

答えて

3

この奇妙な振る舞いについての説明は何ですか?

変数が機能スコープであるためです。

abからmyTestメソッドを渡したことはありません。あなたは8と5を渡したので、myTestの一部であるabの署名が新しい範囲を持っています。 aは8となり、bmyTestの中で5となった。

abmyTestの値は、その範囲がmyTestに制限されているため、外部では使用されません。

+0

私は 'a'を返します。関数 'a'の範囲が8または9であれば、それは返されてもどうしてそれはまだ0ですか? –

+0

@BarAkiva変数ではなく値を返しました。あなたは 'a = myTest(8,5)'をやっていないので、新しい値はありません。 – gurvinder372

1

関数内には、ローカルaというパラメータがあります。その値を変更すると、グローバルに定義されたaが反映されません。関数内にc変数またはパラメータを作成していないため、グローバルcの値が変更されます。

var c = 0;    // Global c 
 
var a = 0;    // Global a 
 
var b = myTest(8, 5); // Store the value of the local a from the function return. 
 

 
function myTest(a,b) { 
 
    console.log(a); // This a is a local reference (8) 
 
    a++;    // Increment local a 
 
    c++;    // Increment global c 
 
    console.log(a); // Print local a    (9) 
 
    return a;   // Return local a 
 
} 
 

 
console.log(a);  // Print global a    (0) 
 
console.log(c);  // Print global c    (1) 
 
console.log(b);  // Print returned value  (9)

+0

OPはパラメータとして 'a'と' c'を渡しません。 – Hacketo

関連する問題