我有以下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文件中的两个按钮。
答案 0 :(得分:4)
回调应该是函数的reference
。
为什么$("#next").click(next());
不起作用?
func()
是函数调用而不是引用,这就是它立即被调用的原因。
此,
$("#next").click(function(){
next();
});
如果需要传递参数,是一种更好的方法。
否则,
$("#next").click(next) //notice just the signature without ()
答案 1 :(得分:1)
这是有效的(如果定义了函数next
和previous
):
$("#next").click(next);
$("#previous").click(previous);
在这种情况下,next
和previous
也是回调函数,两者之间的区别是,
当你拨打这一行时
$("#next").click(next());
该函数立即执行,您将下一个函数的结果传递给jQuery的eventHandler。
,在这种情况下
jQuery API文档(https://api.jquery.com/click/)中的
$("#next").click(next);
您将函数 next 传递给jQuery的EventHandler。
顺便说一句:它显示了点击功能的所有参数及其声明的所需类型: “... 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)。单击(下);会工作。注意括号不是必需的,因为函数/回调处理程序应作为参数传递。