簡體   English   中英

用javascript中的構造函數進行函數調用

[英]Function calling with constructors in javascript

我對javascript中的函數調用感到困惑,有人可以回答以下問題嗎?

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


}


function A(){


}

A();

在這種情況下,將調用哪個函數?它是第一個還是第二個函數? 為什么呢?

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


}


function A(a,b){


}

A();

在這種情況下,將調用哪個函數?它是第一個還是第二個函數? 為什么呢?

提前致謝。

讓我們付諸實踐,看看結果:

 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版本。

在兩種情況下都將調用第二個函數,因為您需要重新定義函數定義。

javascript中也沒有函數重載,在第二種情況下,更改函數簽名(即,它采用的參數)將重新定義相同的A函數(定義為1st)。

在這兩種情況下,都會調用第二個函數,因為它在聲明時會覆蓋全局變量A

這類似於寫作:

var a = 1;
var a = 2;

a === 2; // true

解析器輸入腳本時,它將搜索var語句和function聲明,然后在當前作用域(在您的情況下,這是全局作用域)上創建這些變量。 搜索和創建的過程稱為提升。 因此,在您的情況下,在解析第一個函數聲明時會被發現。 因此,類似的事情發生了:

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

然后解析器繼續搜索並找到另一個函數聲明。 同樣發生:

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

如您所見, scope.A現在引用了第二個函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM