2

次のコードをテストしました。

(function(){
  var x = false;  
  function x(){
    return true;
  }  
  return typeof x;
})();

「ブール値」を返します。そして、2行目にコメントしたときだけ:

(function(){
  //var x = false;  
  function x(){
    return true;
  }  
  return typeof x;
})();

「関数」を返します。これは、誰かが以前にコードのどこかで変数を宣言した場合、同じ名前を使用した関数宣言が失敗することを意味しますよね? 誰か説明してください。ありがとう!

4

1 に答える 1

4

JavaScript では、関数宣言は最初に記述されたかのように扱われます。次に変数宣言。(その特定の順序が問題になることは、あったとしてもめったにありません。)

var変数宣言では、代入部分は、ステートメントが実際に現れる関数内のポイントで発生する別の式ステートメントとして扱われます。したがって:

function foo() {
  // ... some code ...
  if (whatever) {
    var x = whatever + 1;
  }
}

は次のように扱われます:

function foo() {
  var x;
  // ... some code ...
  if (whatever) {
    x = whatever + 1;
  }
}

したがって、全体として、最初のサンプルは次のように扱われます。

(function() {
  function x() {
    return true;
  }
  var x;
  x = false;
  return typeof x;
})();

関数と変数は共通の名前空間を共有することにも注意してください。var既に宣言されている変数名の代入部分のない宣言は効果がありません。(少なくとも、意味のある効果はないと思いますが、JavaScript には奇妙な暗いコーナーがあります...)

于 2013-02-02T18:30:42.277 に答える