2010-06-28 92 views
3
function runSomething() { 
    // some stuff happens 
} 

$(selector).bind('event', runSomething()); 

$(selector).bind('event', runSomething); 

這兩個版本的綁定有什麼區別?2 jquery綁定之間的區別

這裏有一個實際的例子: http://jsbin.com/icajo/edit

有人可以解釋爲什麼工作它的方式。

我想獲得多個按鈕來運行該事件的功能,我該怎麼辦?

回答

0

在JavaScript中,將一組參數傳遞給一個函數調用該函數,它將被計算爲函數的返回值。

var test = function() { return 1; } // Creates a new function that returns 1 
alert(test.toString()); // => "function() { return 1; }" 
alert(test().toString()); // => "1" 

即使alert本身只是一個指向函數的變量。

alert(alert); // => "function alert() { [native code] }" 

因此,如果第一個例子中,主叫runSomething()時,它會立即評估該功能,隨後將返回值作爲參數來bind()。你的情況,它的evals alert()作爲加載頁面時,然後傳遞到undefinedbind()

在第二示例中,使用本身被傳遞到bind()可變runSomething的功能。只有當事件發生後,綁定纔會使用該函數。

要真正打擊你的心,你可以有函數返回一個函數,然後計算函數(如在你的第一個例子)是正確的......例如

var counter = 0; 
function GenerateNext() { 
    counter++; 
    return new Function("alert(" + counter + ")"); 
} 

a = GenerateNext(); 
b = GenerateNext(); 
b() // will alert 2 
a() // will alert 1 

$(selector).bind('event', GenerateNext()); // alert 3 
$(selector).bind('event', a); // alert 1 
$(selector).bind('event', b); // alert 2 

這只是一切都取決於什麼你正在努力去做;傳遞函數本身,或傳遞函數的返回值。

5

在第一種情況下,您將調用runSomething()的結果綁定到第二個函數本身。

更新
@JSNewbie,運行這個並告訴你在每個警報看到。

function runSomething() { 
    return 3; 
} 

var a1 = runSomething(); 
var a2 = runSomething; 
alert(a1); 
alert(a2); 
+0

那麼在第二個版本中,東西不會發生? – JSNewbie 2010-06-28 16:37:14

+0

@JSNewbie:第二個版本在事件上運行函數,而第一個版本在事件發生時運行綁定時由函數返回的內容。 – tcooc 2010-06-28 16:40:10

+0

抱歉太理論了,我不明白。有人可以根據我的實際例子來解釋。 – JSNewbie 2010-06-28 16:44:18

0

在功能runSomething是綁定語句中執行的第一線,而它返回什麼必然的事件,例如,如果您runSomething函數返回另一個函數,那麼該函數的約束,並會在事件中執行。

在第二行,runSomething函數不在該行執行,並且僅在發生「事件」時才執行。

0

$(selector).bind('event', 'runSomething()');(請注意在'runSomething()'左右的附加引號) 當收到事件時運行功能runSomething()

$(selector).bind('event', runSomething); 設置功能runSomething()作爲該事件的回調函數,這意味着它將收到任何參數都包含在事件中,往往這是currentTarget當前(這樣你就可以使用許多按鈕相同的事件)或有用從事件中獲取特定信息(mousemove返回觸發時鼠標的X,Y位置)。

因此,如果您需要訪問事件觸發時返回的事件對象,則第一個版本將無法正常工作。

function runSomething(event){ 
    console.log(event); // this would show the event object if the second code is used. 
} 
0

在JavaScript函數被視爲變量。添加「()」將調用函數,並傳遞函數的結果(如果該函數不返回任何內容,則可能是'未定義')。第二種是使用bind方法的正確方法,因爲它給出了在觸發事件時要調用的函數的句柄。