代码之家  ›  专栏  ›  技术社区  ›  Santosh Khavekar

用javascript中的构造函数调用函数

  •  1
  • Santosh Khavekar  · 技术社区  · 8 年前

    我对javascript中的函数调用感到困惑,有人能回答下面的问题吗?

    **Question 1:**
    function A(){
    
    
    }
    
    
    function A(){
    
    
    }
    
    A();
    

    在这种情况下,将调用哪个函数?它是第一个函数还是第二个函数?为什么?

    **Question 2:**
    function A(a){
    
    
    }
    
    
    function A(a,b){
    
    
    }
    
    A();
    

    在这种情况下,将调用哪个函数?它是第一个函数还是第二个函数?为什么?

    提前谢谢。

    4 回复  |  直到 8 年前
        1
  •  5
  •   emiliopedrollo    8 年前

    让我们付诸行动,看看结果:

    function A(){
      var el = document.getElementById('test');
      el.innerText  = "First function";
    }
    
    function A(){
      var el = document.getElementById('test');
      el.innerText  = "Second function";
    }
    
    A();
    <div id="test"></div>

    正如我们所看到的 功能是赢家。为什么?因为当我们在第一次声明后再次编写它时 覆盖 真的。

    关于第二个问题:

    function A(a){
      var el = document.getElementById('test');
      el.innerText  = "First function";
    }
    
    function A(a,b){
      var el = document.getElementById('test');
      el.innerText  = "Second function";
    }
    
    A();
    <div id=“test”><(lt;)/div>

    如我们所见,它仍然执行第二个问题。那是因为 javascript不是多态语言 也就是说,它不能像java那样有两个名称相同但输入声明不同的函数。我们只是做了与上面相同的事情:我们覆盖函数A。

    PS:如果javascript是多态语言(事实并非如此),那么第二次运行将返回错误,因为我们还没有声明接收0个变量作为输入的函数a的版本。

        2
  •  2
  •   Abhishek    8 年前

    在这两种情况下,当您重新定义函数定义时,将调用第二个函数。

    此外,javascript中没有函数重载,在第二种情况下,更改函数签名(即它所带的参数)将重新定义相同的A函数(定义为第一个)。

        3
  •  1
  •   Max Koretskyi    8 年前

    当解析器进入脚本时,它会搜索 var 报表和 function 声明,然后在当前范围(在您的情况下,它是一个全局范围)上创建这些变量。搜索和创建的过程称为提升。因此,在您的情况下,在解析第一个函数声明时会找到。因此,类似的事情发生了:

    scope.A = function A(){} // first function
    

    然后解析器继续搜索并找到另一个函数声明。同样的情况也发生了:

    scope.A = function A(){} // second function
    

    正如你所见, scope.A 现在引用第二个函数。

        4
  •  0
  •   Christoph    8 年前

    在这两种情况下,都会调用第二个函数,因为它会覆盖全局变量 A 申报时。

    它类似于书写:

    var a = 1;
    var a = 2;
    
    a === 2; // true