函数和变量具有相同的名称

时间:2013-02-24 22:52:13

标签: javascript syntax

以下代码片段是一个测试,用于查看函数和变量在同一范围内共享同一名称时会发生什么。在Chrome中,似乎变量定义在引用中具有优先权。

  1. 可以执行命名函数,还是被变量声明完全遮盖?
  2. Javascript中的标准行为是变量优先于具有相同名称的函数吗?
  3. 对于这两个问题很抱歉,但提出两个不同的问题似乎很浪费。

    代码:

    <!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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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