2016-07-15 63 views
2

我有以下的jQuery代碼:(爲什麼),jQuery的。點擊()需要一個回調函數?

function next() { 
    //some code here 
} 

function previous() { 
    //some code here 
} 

$("#next").click(function(){ 
    next(); 
}); 

$("#previous").click(function(){ 
    previous(); 
}); 

這工作,但這並不:

$("#next").click(next()); 

$("#previous").click(previous()); 

這究竟是爲什麼?在我的代碼中是否存在問題,或者這只是jQuery的一個問題?注:#next#previous是指兩個按鈕在我的HTML文件。

+2

通過在函數名稱後面加上括號來執行函數,並將函數的返回值指定爲回調函數而不是函數本身。 –

回答

1

這工作(如果該功能nextprevious定義):

$("#next").click(next); 

$("#previous").click(previous); 

在這種情況下,nextprevious也回調函數,兩者之間的區別是,

當你調用此行

$("#next").click(next());函數立即執行,並且您正在傳遞下一個函數的結果發送給jQuery的eventHandler。

在這種情況下

$("#next").click(next);要傳遞的功能下一個將jQuery的事件處理程序。

在jQuery的API文檔(https://api.jquery.com/click/)順便說一句:它顯示了點擊功能,所有參數所需的類型也指出:」 ...... 處理類型:Function(事件的EventObject )函數在每次事件觸發時執行。......」

+0

爲什麼downvote?我寫了一些不正確的東西嗎?我怎麼能改善我的答案? –

1

嘗試這樣你會得到你的答案,

function next() { 
    //some code here 
} 

function previous() { 
    //some code here 
} 

$("#next").click(next); 

$("#previous").click(previous); 

工作演示jsfiddle Example

4

該函數的回調應該是reference

爲什麼$("#next").click(next());不起作用?

func()是一個函數調用而不是引用,這就是爲什麼立即調用它。


$("#next").click(function(){ 
    next(); 
}); 

是情況的優選方式,你需要傳遞的參數。

否則,

$("#next").click(next) //notice just the signature without() 
+1

爲什麼在所有答案上都有一個倒退?如果有一個改進的範圍,那麼每個人都可以自由地澄清或編輯問題。 –

0

這是怎麼回事那裏是匿名函數function() { ... }語法模糊一點點。你正在做的是傳遞一個函數,而不是調用它。我想解釋一下這是如何工作:

如果你有一個簡單的功能

function next() { return 5 }; 

它只是返回值5,如果你從什麼地方把它叫做:

a = next(); // value of a will be 5 

但什麼你也可以這樣做,就是把整個功能傳遞給a。這是可能的,因爲在JavaScript函數實際上是對象:

a = next; 
b = a(); // value of b will be 5 

如果你看一下語法,它會告訴你,這把括號()在函數結束調用它,並返回返回值。而沒有括號的裸體字符串則會傳遞給函數本身。

那麼什麼是回調現在,click()想要獲得什麼樣的參數?回調函數是一個函數,稍後調用;我們實際上把它交給了,以後再打電話。 click()想要得到這樣一個函數作爲參數,現在應該清楚,我們必須通過沒有括號的函數,以使click()稍後調用它,而不是僅僅傳遞一個5

$("#next").click(next); 

那麼如何使用匿名函數的初始語法工作?

function() { next(); } 

實際包裝您的next()到另一個函數,這是匿名的 - 因爲它不會有一個名字 - 但正在以同樣的方式作爲命名功能。你甚至可以用它設置一個變量:

a = function() { next(); } // a will be the anonymous function that calls next() 

但調用該函數a()將返回任何結果,因爲匿名函數不返回一個值(要準確:在JavaScript中每個函數調用返回至少undefined,但這是一個技術細節)。 它甚至可以立即通過把括號在它到底叫:

a = function() { return next(); }() // value of a will be 5 

添加return存在將確保的next()返回值將通過匿名函數傳遞。

這應該清楚爲什麼

$("#next").click(function(){ next(); }); 

工作,爲什麼

$("#next").click(next()); 

不大,但

$("#next").click(next); 

將是一個很好的解決方案。

0

$(「#next」)。click(next);會工作。注意括號不是必需的,因爲函數/回調處理程序應作爲參數傳遞。

相關問題