1

爲什麼不使用函數聲明,但它的工作完美使用函數表達式? 假設唯一的區別是瀏覽器如何將它們加載到執行上下文中。爲什麼我不能在JQuery的事件處理函數中將「函數聲明」作爲參數傳遞?

function foo(event){ 
    console.log('in foo'); 
} 

$('.btn').on('click',foo(event)); 

$.ajax({ 
    beforeSend:function(){ 
     $('btn').unbind('click'); 
    }, 
    success: function(){ 
     $('btn').bind('click', foo(event)); 
    } 
}); 

隨着函數表達式它的偉大工程:

var foo = function(event){ 
    console.log('in foo'); 
} 
+6

你會意識到,'FOO(事件)'調用函數,並傳遞返回值('undefined')爲'.bind'? – Jon

+0

不是因爲遵循這個:http://stackoverflow.com/a/336868/2326828,foo(event)在「代碼區域」(在程序執行之前)中聲明的不是嗎? – Pompeyo

回答

8

這裏:

$('.btn').on('click',foo(event)); 

你不能傳遞一個 「函數式」。你傳遞的結果是,調用函數「foo」。這就是JavaScript語法工作的方式—如果您引用一個函數(通過名稱或其他方式),然後使用括號括起來的參數列表(可能爲空)進行操作,那麼您正在調用該函數。

這裏:

var foo = function(event){ 
    console.log('in foo'); 
} 

創建一個函數,而不是傳遞。請注意,在您的「foo」示例中,function關鍵字不存在。

如果你想通過「foo」函數爲事件處理,只是名稱引用它:

$('.btn').on('click', foo); 

即不通過一個參考函數「foo」的調用它。 jQuery API將獲得該函數引用並使用「foo」作爲「click」事件的處理程序。

如果你需要在某個地方傳(喜歡一個jQuery API)的函數的引用,你想要的功能與一些額外的參數來調用,你有兩個選擇:

  1. 使用.bind()方法在函數原型上,或者
  2. 將函數自動換行另一個函數。

對於jQuery事件處理函數,第三種選擇是提供一個對象作爲參數.on()。該對象將被連接到通過event參數時,事件實際發生:

function foo(event) { 
    var data = event.data; 
    if (data.whatever) { // ... 

然後,當你調用.on()

$('.btn').on('click', { whatever: true }, foo); 
+0

@DavidThomas我認爲你修正了「有」 - >「作爲」的事情是正確的?我認爲對我來說看起來沒問題。 :)也謝謝! – Pointy

相關問題