2016-09-26 151 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)。