【问题标题】:Function and variable with the same name同名函数和变量
【发布时间】:2013-02-24 22:52:13
【问题描述】:

下面的代码-sn-p 是一个测试,看看当一个函数和一个变量在同一个作用域内共享同一个名字时会发生什么。在 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>

【问题讨论】:

  • 我猜 Javascript 将函数提升到顶部,使变量定义发生在函数定义之后。因此最后一个定义——变量——是使用的。

标签: javascript syntax


【解决方案1】:

在 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

【讨论】:

【解决方案2】:
  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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多