5

次のコードを考えると、アラートに何が表示されると思いますか?

var a = 100;
function afunc(infunc){
  a = 10;
  infunc.call();
}

afunc(function(){alert(a)});

私の最初の考えは、変数a = 100がafuncに引数として渡される無名関数のスコープ内にあるため、ブラウザーは100を警告する必要があるというものでした。ただし、これは匿名関数が実際にグローバルコンテキストで定義されていることを前提としています。ブラウザが10に警告するので、明らかにそうではありません。では、スコープチェーンでa=100よりもa=10が進んでいるのはなぜですか。

ありがとう!

4

3 に答える 3

6

匿名関数を呼び出す前にaを10に設定しているためです。aは実際にはグローバルですが、10に設定しています。

于 2012-07-20T16:30:22.187 に答える
6

では、なぜスコープチェーンでa=10がa=100よりも進んでいるのでしょうか。

そうではありません。定義aした変数は1つだけで、アラートが表示される前にからに変更されているだけ100です10

asを独自の値を持つ別個の変数にしたい場合は、両方にvarキーワードが必要です。

var a = 100
function afunc(infunc){
  var a = 10;
  infunc.call();
}

afunc(function(){alert(a)})​
于 2012-07-20T16:31:13.353 に答える
1

次の例を考えてみましょう。

var a = 100;

function afunc(infunc){
  a = 10;
  var f = function (){
    console.log(a);
  };
  f.call();
  infunc.call();
}

afunc(function (){ console.log(a); });

aのスコープ内に値10を割り当ててから、afuncの値をログに記録する2つの関数を次々に呼び出しますa。この場合、両方の関数がの値として10をログに記録することを期待しますがa、実際にはそれが発生します。

あなたの例では、実際に定義された場所に関係なく、でinfunc定義されたローカル関数と本質的に同じスコープで実行されます。より狭い範囲でafunc値を割り当てたので、それはを呼び出すときの値です。aainfunc

次の例のように、関数はその定義からある程度のスコープを保持します。

function bfunc(){
  var b = 'hello';
  return function (){ console.log(b); };
}

afunc(bfunc());

ここで、によって返される無名関数は、bfunc実際にはのスコープ内から呼び出されますが、元のスコープで割り当てられたafuncの正しい値をログに記録することは可能です。に別の値を割り当てるbように変更した場合でも、で定義されたはで定義されたものとは異なる変数であるため、ログに記録されます。afuncb"hello"bafuncbbfunc

于 2012-07-20T16:54:41.460 に答える