2016-09-26 152 views
1

我在JavaScript中调用函数时出现混淆,有人可以告诉下面的问题吗?函数调用在javascript中的构造函数调用

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


} 


function A(){ 


} 

A(); 

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

**Question 2:** 
function A(a){ 


} 


function A(a,b){ 


} 

A(); 

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

在此先感谢。

+3

第二个函数,因为它是在第一次声明后声明和定义的。 –

+0

你不能用这种方式重写一个函数,javascript调用函数使用函数名,与参数无关。 – passion

+0

这类问题有几个重复。 – jfriend00

回答

5

让我们把它的行动和看到的结果:

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"></div>

正如我们看到的,它仍执行第二个问题。这是因为javascript不是一个多态语言,也就是说,它不能有两个函数具有相同的名称,但具有像java那样的不同输入声明。我们只是做了同样的事情:我们覆盖函数A.PS:如果JavaScript是一个多态语言(它不是),那么第二次运行会返回一个错误,因为我们没有声明接收0变量作为输入的函数A的版本。

0

在这两种情况下,第二个函数将被调用,因为它声明时会覆盖全局变量A

它类似于写作:

var a = 1; 
var a = 2; 

a === 2; // true 
+0

这是一个很糟糕的类比,因为函数声明同时声明和定义(提升),但是变量声明的行为不同,它只声明它但不定义它。 ([Demo](https://jsfiddle.net/DerekL/eafjLhLa/)) –

+0

这就是为什么我写它是相似的,不一样的。 – Christoph

0

当分析器进入脚本,它搜索var语句和function声明,然后创建在当前范围的变量(在你的情况下,它是一个全球范围内)。搜索和创建过程称为提升。所以在你的情况下,当解析第一个函数声明被发现。所以,这样的事情发生了:

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

然后解析器继续搜索,发现另一个函数的声明。而同样的情况:

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

正如你可以看到,现在scope.A引用第二功能。

2

在这两种情况下都会调用第二个函数,因为您重新定义了函数定义。

另外,在JavaScript中没有函数重载,在第二种情况下,更改函数签名(即它所需的参数)将重新定义相同的A函数(定义为1st)。