0

node.jsの非同期コーディングを行うときに質問があります。コード例は次のとおりです。

function foo(arg) {
  var a = arg;
  console.log(a + ' start');
  setTimeout(function () {console.log(a);}, 500);
};
foo(1);
foo(2);

以下を出力します。

1 start
2 start
1
2

よくわかりません。ローカル変数はfoo(2)によって変更されるので、出力するべきだと思いました↓

1 start
2 start
2
2

node.jsが内部コールバック関数アクセス用のローカル変数を保持する理由/方法を教えてください。どうもありがとう!

4

3 に答える 3

4

これはローカル変数であり、グローバルではないためです。それがローカル変数のポイントです。

var a関数呼び出しの存続期間中に存在する変数を作成します。その中で関数を宣言すると、その関数もカバーするように寿命が延びます。a匿名関数が呼び出されると、作成されたスコープに存在するを引き続き使用します。

外部関数を2回呼び出すため、2つaのがあります。呼び出しごとに1つ。呼び出しごとに1つずつ、2つの匿名関数があります。各無名関数は、の1つと同じスコープで作成されましたa

于 2012-04-09T12:18:28.077 に答える
1

正常に動作しています。a関数内で変数をvar a;宣言しました。これは、ご存知のとおり、ローカル変数を宣言します。のコールバックはsetTimeout、関数と同じスコープ内にあります(そして、もそうですvar a)。そうは言っても、スコープがどのように機能するかを理解するだけです。これはそれについての古くて良い投稿です:http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

または、グーグルで「javascriptスコープ」を検索するだけで、たくさんのリファレンスを見つけることができます。

于 2012-04-09T12:21:25.480 に答える
1

JavaScript変数は、ブロックではなく、関数宣言によってスコープされます。したがって、2つの異なる変数を使用しています。

于 2012-04-09T12:21:03.023 に答える