![](/img/trans.png)
[英]OO Javascript, calling prototype function from constructors addEventListener
[英]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.