2011-07-05 31 views
8

我是jQuery的新手,对使用(或不使用括号)回调函数有点困惑。说我有一个功能:回调函数 - 使用括号

function cb() { 
// do something 
} 

现在是什么样的区别:这是对与的CB函数执行做

$("p").hide(1000, cb); 

$("p").hide(1000, cb()); 

?如果有人能够以最简单的方式向我解释这一点,那将是非常棒的。

+3

建议:在控制台复制此,看到了差异:'函数cb(){返回42;};的console.log(CB); console.log(cb());' –

+3

这是JavaScript的一项功能。它不仅限于jQuery。 –

+0

啊的确值得一提。 jQuery是一个_library_(并且函数''''和'.hide'来自它)。但是,像这样的基本语法规则是由JavaScript语言编写的。因此,除了周围的上下文之外,这个问题与jQuery实际上几乎没有关系。 –

回答

8

cb()指给我执行功能CB的结果。

cb IS功能CB或,更精确地指针(参考)给它。

+0

谢谢(也对所有回答过的人)。我认为我理解cb()但是用cb,我想在什么情况下引用它? – Edwin

+1

@Edwin - 使用你的隐藏的例子,你通常会定义一个函数内联,但如果你有一个预定义的函数,你可以参考它,就像你已经显示 - 没有parens ... – Michael

6

它与cb函数执行时有关吗?

本质上来说,是的,虽然差异比这个稍微深一点。

  • cb是对函数进行排序的参考。你将这个函数作为参数传递到某个地方。

  • cb()是一个函数调用;该函数将被调用,结果作为参数传递给.hide

2

$("p").hide(1000, cb);经过cb引用的函数,作为回调。

$("p").hide(1000, cb());传递函数cb被调用时返回的值。

考虑:

function cb(){ return true; } 

前者是通过回调供以后调用。后者通过返回值true,本质上是$("p").hide(1000, true);

+1

*“传递函数'cb )'(作为回调函数)“*()(函数名称后面)在这里引起混淆。 –

+0

是的。为清晰起见进行编辑。 – Dan

2

不同之处在于,javascript函数是第一类对象,可以传递给其他函数,以便它们可以在稍后阶段执行或取决于某些逻辑。

考虑以下几点:

function add(a, b) { 
    return a + b; 
} 

function minus(a, b) { 
    return a - b; 
} 

function apply(func, a, b) { 
    return func(a,b); 
} 

apply(add, 3, 4); // returns 7 
apply(minus, 3, 4); // returns -1 

apply(add(), 3, 4); // error: invalid number of arguments for add 

apply(add(0,0), 3, 4); // error: add returns 0, but 0 is not a function and 
// so apply crashes when it tried to call zero as a function