30

次のコードスニペットは、関数と変数が同じスコープ内で同じ名前を共有している場合に何が起こるかを確認するためのテストです。Chromeでは、変数定義が参照で優先されているように見えます。

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

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

コード:

<!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

2 に答える 2

18

JavaScriptでは、関数定義は現在のスコープの一番上に引き上げられます。したがって、サンプルコードは次のようになります。

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

これは、このトピックに関するいくつかの良い読み物です:http ://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

于 2013-02-24T22:57:57.567 に答える
0
  1. 名前付き関数を実行できますか、それとも変数宣言によって完全に隠されていますか?

    そこでは関数宣言は実行されません同じ名前の使用法のため、関数式は関数宣言をオーバーライドします。

  2. 変数が同じ名前の関数よりも優先されるのは、Javascriptの標準的な動作ですか?

    どちらか一方を優先することではありません。JavaScriptでは、関数宣言は、それを囲む関数またはグローバルスコープの先頭に持ち上げられます。同じ変数名の関数式は、関数宣言をオーバーライドします。

例:

   foo(); // Function Declaration - will be hoisted
   foo = function() { console.log("Function Expression  - will NOT be hoisted"); };
   function foo()   { console.log("Function Declaration - Will be hoisted"); }
   foo(); // Function Expression  - will NOT be hoisted 
于 2020-09-01T11:32:44.713 に答える