(为什么)jQuery .click()需要回调函数吗?

时间:2016-07-15 05:40:20

标签: javascript jquery html

我有以下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文件中的两个按钮。

5 个答案:

答案 0 :(得分:4)

回调应该是函数的reference

为什么$("#next").click(next());不起作用?

func()是函数调用而不是引用,这就是它立即被调用的原因。

此,

$("#next").click(function(){
    next();
});
如果需要传递参数,

是一种更好的方法。

否则,

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

答案 1 :(得分:1)

这是有效的(如果定义了函数nextprevious):

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

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

在这种情况下,nextprevious也是回调函数,两者之间的区别是,

当你拨打这一行时

  

$("#next").click(next());该函数立即执行,您将下一个函数的结果传递给jQuery的eventHandler。

,在这种情况下

  

$("#next").click(next);您将函数 next 传递给jQuery的EventHandler。

jQuery API文档(https://api.jquery.com/click/)中的

顺便说一句:它显示了点击功能的所有参数及其声明的所需类型: “... handler 类型:Function(Event eventObject)每次触发事件时执行的函数。”

答案 2 :(得分:1)

尝试这样你会得到答案,

data Config = Config { say     :: String -> IO ()
                     , verbose :: String -> IO ()
                     }

mkSay :: Bool -> String -> IO ()
mkSay quiet s | quiet     = return ()
              | otherwise = putStrLn s

-- In some action...
  let config = Config (mkSay quietFlag) (mkVerbose verboseFlag)

compute :: Config -> IO Value
compute config = do
  -- ...
  verbose config "Debugging info"
  -- ...

工作演示jsfiddle Example

答案 3 :(得分: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()稍后调用它,而不是仅传递{ {1}}它。

5

那么匿名函数的初始语法如何工作呢?

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

实际上将您的function() { next(); } 包装到另一个匿名函数中 - 因为它没有名称 - 但是它的工作方式与命名函数相同。您甚至可以通过它设置变量:

next()

但是调用该函数a = function() { next(); } // a will be the anonymous function that calls next() 将不会返回任何内容,因为匿名函数不返回值(确切地说:JavaScript中的每个函数调用至少返回a(),但是&#39}技术细节)。 它甚至可以通过在其末尾加上括号来立即调用:

undefined

添加a = function() { return next(); }() // value of a will be 5 将确保return的返回值将通过匿名函数传递。

这应该说明原因

next()

正在运作,为什么

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

不是,但是

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

将是一个很好的解决方案。

答案 4 :(得分:0)

$("#下一&#34)。单击(下);会工作。注意括号不是必需的,因为函数/回调处理程序应作为参数传递。