2013-04-01 82 views
1

爲什麼這個不行:命名以前匿名函數打破

$(document).on('click','a',myFunction); 
var myFunction = function() { 
    debugger; 
} 

當這樣做:

$(document).on('click','a',function() { 
    debugger; 
} 

我開始學會命名我所有的匿名函數,並打破他們更多分成他們自己獨立的命名功能。

+2

哦,這是因爲我必須在引用它之前定義函數。它必須在源代碼順序上面。 –

+0

但是沒有辦法提升函數聲明嗎? –

+1

函數*聲明*總是被掛起。但是你有什麼不是聲明,它是一個函數*表達式*。有關詳細信息,請參閱我答案底部鏈接的文章。 – bfavaretto

回答

0

不要說:

var myFunction = function() { 
    debugger; 
} 

你需要說:

function myFunction() { 
    debugger; 
} 

這將宣佈在第一輪的功能,使得它可以在程序執行過程中被引用。

4

你必須換行:

var myFunction = function() { 
    debugger; 
} 
$(document).on('click','a', myFunction); 

否則,你會assigning undefined作爲事件處理程序,如變量myFunction沒有一個值然而,當你將它傳遞給.on

另外:將一個函數賦值給一個像這樣的變量沒有命名的變量,它仍然是一個匿名函數,只是存儲在一個變量中。命名函數是:

var myFunction = function someName() { 
    debugger; 
} 

詳情請參閱Named function expressions demystified

+0

哇。 JavaScript永遠不會讓我感到意外。這就是爲什麼我問這些基本問題,因爲我總是學到一些我從未期望的東西。 –

+1

@Benjamin感謝編輯,這些鏈接使答案更好。 – bfavaretto