2013-01-25 197 views
3

可能重複:
Why does click event handler fire immediately upon page load?事件處理程序自動點擊事件觸發 - jQuery的

有一個在我的JavaScript的功能的理解,所以我很難理解爲什麼我的事件處理程序得到一個缺口如果我在沒有匿名包裝的情況下定義它,它會自動啓動。

HTML

<a href="#" id="change-html">Change HTML</a> 

的Javascript#1

var btn = $('#change-html'); 
btn.click(bindClick(btn)); // bindClick gets executed right away and only once 

function bindClick(source){ 
    console.log('get here'); 
} 

的Javascript#2

var btn = $('#change-html'); 
btn.click(function(){ 
    bindClick(btn); // bindClick is only executed on the anchor's click event 
}); 

function bindClick(source){ 
    console.log('get here'); 
} 
+0

'()'函數引用後** **調用功能。你認爲在這個例子中首先執行了哪個函數:'foo(bar())'?當綁定事件處理程序:) –

+0

非常感謝。現在很明顯。 –

回答

6

其實這裏

btn.click(bindClick(btn)); 

你的函數的返回值只是結合的Click事件,而不是函數本身。
由於在JavaScript就可以返回一個函數這會工作

var btn = $('#change-html'); 
btn.click(bindClick(btn)); 

function bindClick(source){ 
    return function() { 
     console.log('get here'); 
    }  
} 

http://jsfiddle.net/VZ4Gq/

編輯 - ?是第二個函數閉包是的,它可能be.Let的永樂在這個例子中

var btn = $('#change-html'); 
btn.click(bindClick(btn)); 
// global scope 
var inside = "i'm outside a closure"; 
console.log(inside); 
function bindClick(source){ 
    // local scope 
    var inside = "i'm inside a closure"; 
    return function() { 
     console.log(inside); 
    } 
} 

http://jsfiddle.net/VZ4Gq/1/

當您嘗試此操作時,您會記錄「我在關閉之外」第一個然後當你點擊按鈕時,你會看到「我在關閉中」。這是因爲你實際上創建了一個封閉和的高效多功能,當它的executo,它執行的是原來的範圍,這是內部bindClick()

+0

謝謝。我仍然在努力理解關閉。 –

+0

或者,甚至更好的辦法是修改你的'bindClick'函數,所以你不需要參數 - 你已經在事件處理函數中有'this'來引用觸發事件的元素,傳入它並不會真正地任何意義(這只是一個額外的,不必要的複雜)。那麼你可以這樣做:'btn.click(bindClick);' –

+0

@LimH。這不是一個閉包,一個閉包它是一個不同的東西,這與Felix King在評論中明確解釋的函數執行順序有關。 我的例子只是告訴你BindClick在btn.click()之前執行,因此BtnClick的返回值(這是一個函數)被指定爲事件處理程序。 –

1

的問題是:

btn.click(bindClick(btn)); 

它會調用bindClick方法。 嘗試改變該行與此,看看行爲,如果同一個用JavaScript#2:

btn.click({param1: btn }, bindClick); 

或者更簡單:

btn.click({param1: btn }, $(this)); 
+0

'btn.click({param1:btn},$(this));' - 你能解釋一下嗎? bindClick函數在哪裏? –

+0

@LimH。該代碼沒有任何有效的解釋,因爲它不正確。 –