同名的函数和变量

IT技术 javascript syntax
2021-02-27 06:28:59

下面的代码片段是一个测试,看看当一个函数和一个变量在同一范围内共享相同的名称时会发生什么。在 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>
2个回答

在 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

很棒的文章。您可以使用任何值覆盖命名函数这一事实似乎确实存在问题,尽管必须有一些设计优势。进入这个问题时,我假设变量和函数被视为两个谨慎的项目,因为没有抛出错误。
2021-04-30 06:28:59
  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