2015-11-28 25 views
1

我有一個JavaScript文件,我寫了一堆jQuery的功能。我有一個函數來返回角度範圍。我發現如果我要寫兩次相同的函數,代碼仍然會執行。爲什麼我能在javascript中定義兩次相同的函數?

function getngScope() 
{ 
    alert(2); 
    return angular.element($('#data-area')).scope(); 
} 

function getngScope() 
{ 
    alert(1); 
    return angular.element($('#data-area')).scope(); 
} 

當我打電話給getngScope()我得到「1」警報和範圍返回。爲什麼會有這種行爲?

+0

當你寫第二個,它有點替換第一個,所以這就是爲什麼它的發生 –

+1

你在做什麼不被認爲是在JavaScript錯誤。換句話說,這並不違反語言中的任何規則。 – Pointy

+1

你爲什麼要這麼做?你不應該這樣做! –

回答

0

很明顯,你不打算定義兩次相同的功能。但是,當你這樣做時,後面的定義是唯一適用的定義。儘量不要那樣做。尋找另一種方式,除了給兩個功能相同的名稱。

+0

我從來沒有意識到,寫一個新的函數將同名將覆蓋第一個,在JS! –

+0

不只是在JS中,我曾經處理過的語言非常多。無論如何,你爲什麼要這麼做?也許我可以建議另一種方法喲。 – Y2H

+0

@ Y2H好的Java和C肯定會在同一個上下文中抱怨兩個同名的函數。 – Pointy

1

功能在內存堆棧數據,所以當你定義具有相同名稱的另一個功能,它會覆蓋前一個。

0

第二個功能取代了第一個功能,你總是可以通過修改函數的名稱改變這一點,如果沒有可以..如果是以往任何時候都需要添加多個參數和... ...的交代這種行爲,不像其他編程語言,javascript不會在執行時返回任何錯誤。所以你可以假設它只是在執行過程中通過覆蓋函數來糾正自己。

2

對象的第二個定義會覆蓋第一個對象。通常,對象的最後定義會覆蓋所有以前的定義。在JavaScript

函數是對象:

(function() {}) instanceof Object === true 

當你創建一個新的全球功能f它相當於創建的window對象的屬性和分配功能定義變量,如果你創建一個函數:

function myFun() { console.log('my function') }; 

,然後檢查window.myFun的價值,你會發現它是相同的功能myFun

window.myFun === myFun // true 

您還會注意到修改window.myFun更改/覆蓋myFun

E.g.

function myFun() { console.log('myFun') }; 
myFun(); // Prints: 'myFun' 

// Overwrite myFun 
window.myFun = function() { console.log('NoFun') }; 
myFun(); // Prints: 'NoFun' 

該函數的第二個定義優先。由克羅克福德好的部分:

我建議你讀的JavaScript功能上的一章。

相關問題