关闭和争论混乱

时间:2013-02-09 01:21:33

标签: javascript scope closures

我正在努力理解为什么在使用回调函数和闭包时我会得到不同的结果。

第一种情况:

var cb = function(){
   console.log("anim done");
} 

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, cb);

circle.animate(anim);

运行时,有问题的圆圈会动画,2秒后,控制台会显示“anim done”消息。

第二种情况:

var cb = function(msg){
   console.log("anim done");
} 

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, cb("test"));

circle.animate(anim);

这会导致回调(cb)立即执行。这样就可以立即显示“anim done”消息。

有人可以澄清这里发生的事情吗?

2 个答案:

答案 0 :(得分:1)

当你单独放置一个函数名时,它只是求值函数(函数名实际上只是一个值为函数的变量。

当您使用括号跟随函数名称时,表示使用给定的参数在此时调用该函数。该值是函数返回的值。

如果要传递将调用该函数的函数,则必须使用function关键字将其包装在闭包中:

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, function() {cb("test")});

答案 1 :(得分:0)

当您提供回调时,它必须是一个函数。 cb("test")不是函数 - 它是函数的返回值。如果你从cb("test")返回一个函数,那么它将按预期工作。

实际上,你应该这样做:

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, function() {
    cb("test");
});

这样您就可以将一个函数而不是已经计算过的表达式传递给动画。