30

下面的代码片段是一个测试,看看当一个函数和一个变量在同一范围内共享相同的名称时会发生什么。在 Chrome 中,变量定义似乎具有参考优先级。

  1. 可以执行命名函数,还是完全被变量声明所掩盖?
  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

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 回答