2013-02-24 30 views
26

次のコードスニペットは、関数と変数が同じスコープ内で同じ名前を共有する場合の動作を確認するためのテストです。 Chromeでは変数定義の優先順位が参照されているようです。同じ名前の関数と変数

  1. 名前付き関数を実行するか、変数宣言によって完全に隠蔽できますか?
  2. Javascriptの標準的な動作は、変数が同じ名前の関数よりも優先されますか?

2つの部分の質問は申し訳ありませんが、2つの質問をするのは無駄に思えました。

コード:JavaScriptで

<!DOCTYPE html> 
    <head> 
     <meta charset="utf-8"> 
     <title></title> 
    </head> 
    <body> 
     <script> 

      var overlapping = function() { return 'this is a var holding an anonymous function' }; 

      function overlapping() 
      { 
       return 'this is a function definition'; 
      } 

      output(overlapping, 'overlapping'); 
      output(overlapping(), 'overlapping()'); 

      function output(expression, description) 
      { 
       document.writeln('<li>' + (description ? ('<i>' + description + '</i>: ') : '') + expression + '</li>'); 
      } 
     </script> 
    </body> 
</html> 
+4

var overlapping = function() { return 'this is a function definition' }; var overlapping = function() { return 'this is a var holding an anonymous function' }; 

これはこのトピックに関するいくつかの良い読み物です。したがって、最後の定義 - 変数 - は使用されたものです。 –

答えて

15

、関数の定義は、現在のスコープの先頭に掲揚されています。あなたのサンプルコードは、したがってとして読み取ります。私は、Javascriptがトップに機能をホイスト推測変数定義は、関数定義の後に発生作ってるんだhttp://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+2

すばらしい記事。名前付き関数を任意の値で上書きできるという事実は、実際には問題に見えますが、設計上の利点があるはずです。この質問には、変数と関数が2つの別個の項目として保持されていると仮定しました。エラーがスローされなかったからです。 –

+2

また便利です:1)http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname 2)http://javascriptweblog.wordpress.com/2010/07/06/function -declarations-vs-function-expressions / –

関連する問題