2012-11-20 37 views
0

可能重複:
JavaScript: var functionName = function() {} vs function functionName() {}的Javascript通過名字綁定事件處理函數

爲什麼這項工作...

$("#clickme").click(showAlert); 

function showAlert() { 
    alert("Hiya"); 
} 

...但不是這個.. 。?

$("#clickme").click(showAlert); 

var showAlert = function() { 
    alert("Hello"); 
} 
+0

也有關:http://stackoverflow.com/questions/6448567/difference-between-javascript-function-claclarations – epascarello

回答

4

這是由於hoisting
在你的第一種情況下,該代碼被解釋爲(注意如何函數聲明被評估前):

function showAlert() { 
    alert("Hiya"); 
} 
$("#clickme").click(showAlert); 

而第二個被解釋爲:

var showAlert; 
$("#clickme").click(showAlert); 

showAlert = function() { 
    alert("Hello"); 
} 

由於showAlert是可變聲明而不是函數聲明(請注意關鍵字var),首先計算變量聲明,並且在綁定事件處理函數時,聲明showAlert變量,但它保存undefined值。

這是什麼吊裝:它葫蘆閉合頂部的變量和函數聲明。
hositing有幾個很好的資源,包括here on SO

+0

這是另一篇關於[** JavaScript提示**]的好文章(http://net.tutsplus的.com /教程/ JavaScript的AJAX /快速尖端JavaScript的曳引解釋/)。 +1 – Aust

+0

感謝提醒我關於提升 - 我實際上已經知道這從使用jslint,但也許因爲var聲明是一個函數,我沒有意識到它的應用。 – Xoundboy

3

第一個是Function Declaration..

第二種是function Expression..

函數聲明被執行的任何代碼之前首先被讀取。

因此,第一個案件的作品。因爲不是由該功能被分配給它的時間尚未確定,第二種方法不工作..

那麼這將工作

var showAlert = function() { 
    alert("Hello"); 
} 

$("#clickme").click(showAlert); 

即定義函數,然後分配處理程序

相關問題