2016-07-15 62 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);会工作。注意括号不是必需的,因为函数/回调处理程序应作为参数传递。

相关问题