2013-08-30 89 views
1

爲什麼不可能將定義的函數用作事件回調?使用定義的函數而不是匿名函數作爲回調

<div id="me"> 
    <input> 
</div> 

$(document).ready(function(){ 
    // $("#me").on('keyup', 'input', doit()); # doesn't work 
    // $("#me").on('keyup', 'input', 'doit'); # neither does this 
    $("#me").on('keyup', 'input', function() { 
    doit(); 
    }); // well, this one works of course 
}); 

function doit() { 
    console.log($("input").val()); 
} 
+5

當你通過doit()作爲回調,你 – roblarsen

+1

你......它就像你進入虛空;) – andlrc

+2

那個評論是非常懸念的。 – Marc

回答

6

你應該傳遞給函數,而不是把它

$("#me").on('keyup', 'input', doit) 

要清楚爲什麼這是錯的,看看這個例子:

$("#me").on('keyup', 'input', (function() { 
    doit(); 
})()); 

這裏要傳遞一個匿名函數並調用它立即,這不是事件處理程序所期望的。

問題不在於匿名與否之間的區別,問題是您調用的是函數而不是傳遞它。

8

你需要傳遞函數作爲參數。

$("#me").on('keyup', 'input', doit); 
+0

謝謝你。試過了,這確實有效:http://jsbin.com/IZecIj/1/edit但是,我仍然困惑爲什麼會出現這種情況。順便說一下,我在發佈的代碼中有一個錯字,我也嘗試過「doit」。 –

+0

@MajidFouladpour同樣適用於警報,所以請嘗試使用alert而不是'console.log' ..可能是jsbin覆蓋'console.log'?不確定 –

+0

@Vega,'console.log'工作正常;我曾用「doit」而不是「doit」。 –

1

當你說js中的某些東西= function(){blah}時,它會將它作爲文本存儲並且隨時解析它 - 所以可以。 例如:

CallMe = function(){ alert("blah!"); } 
bobsCallback.setFunction(CallMe); 

的CallMe是像任何其他變量,但它的含量是該函數的JS。 可以圍繞把它作爲一個回調,或者調用像這樣:

alert("calling CallMe..."); 
CallMe(); 
2

當您在doit()通(的「()」)作爲回調,實際上是在這一點上運行的功能並將該函數的返回值(可能爲undefined)作爲回調傳遞給。如果您只傳入了指定功能doit的引用,則該函數將作爲回調執行。

+0

歡迎來到SO Rob! ;-) – Mathletics

+0

是的。雖然我一直在一點點。這是我已經回答的第一個非螞蟻問題之一。 – roblarsen

相關問題