2017-03-10 84 views
0

在JavaScript中,我們可以定義一個函數,然後分配給它,如下所示:分配給函數是否覆蓋函數或創建隱式的全局?

function spam() { return "spam 'n eggs"; } 
spam = spam(); 
spam(); // TypeError: spam is not a function. 

此代碼是否改變了一個名爲垃圾全局變量的值,或創建陰影的功能隱式的全局變量垃圾郵件

回答

1

它不覆蓋函數,但它確實爲該變量分配了一個字符串。第一行定義的函數返回一個字符串,並且因爲第二行設置spam等於返回值(因爲函數被調用(注意括號)),所以垃圾郵件是string

在瀏覽器控制檯中嘗試這個:window.spam。在第一行之後,它應該顯示該功能。然後在第二行後顯示該字符串。

function spam() { 
 
    return "spam 'n eggs"; 
 
} 
 
console.log('typeof spam: ',typeof spam, 'typeof window.spam: ',typeof window.spam); 
 
spam = spam(); //spam is assigned a string 
 
console.log('typeof spam: ',typeof spam, 'typeof window.spam: ',typeof window.spam); 
 
spam(); // TypeError: spam is not a function.

如果我們搬到一個函數內部的代碼,該var關鍵字可用於本地範圍:

function assignSpam() { 
 
     var spam = function() { return "spam 'n eggs"; } 
 
     console.log('typeof spam after initial assignment: ',typeof spam); 
 
     spam = spam(); //spam is assigned a string 
 
     console.log('typeof spam after assigning to spam(): ',typeof spam); 
 
     spam(); // TypeError: spam is not a function. 
 
    } 
 
    assignSpam(); 
 
    spam; //undefined

結果應該是相似的服務器端JavaScript(例如NodeJS)。

+0

這並不完全是我覆蓋的含義(請參閱編輯),但仍然回答我的問題。 – JeremiahB

1

這是否代碼改寫由稱爲垃圾全局變量保持的功能,

號分配給垃圾初始值爲給函數的參考。分配新值不會改變功能,它只會爲垃圾郵件分配一個新值。

E.g.

function spam(){return 'I am spam';} 
 

 
var b = spam; 
 

 
spam = spam(); 
 

 
console.log(spam) // 'I am spam' 
 

 
console.log(b); // Original "spam" function 
 

 
console.log(b()); // 'I am spam'

或創建陰影的功能,垃圾郵件的隱式的全局變量?

它只是爲垃圾郵件分配一個新值。原始函數對象仍然存在,但如果沒有其他引用,則可用於垃圾回收。