Javascript 闭包和论点混淆

Javascript 闭包和论点混淆,javascript,scope,closures,Javascript,Scope,Closures,我试图理解为什么在使用回调函数和闭包时会得到不同的结果 第一种情况: var cb = function(){ console.log("anim done"); } var anim = Raphael.animation({ transform: 't0, 100' }, 2000, cb); circle.animate(anim); var cb = function(msg){ console.log("anim done"); } var anim =

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

第一种情况:

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

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

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

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

circle.animate(anim);
运行此操作时,相关圆圈将设置动画,2秒钟后,控制台中将显示“anim done”(动画完成)消息

第二种情况:

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

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

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

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

circle.animate(anim);
这会导致立即执行回调(cb)。这将导致立即显示“动画完成”消息


有人能澄清一下这里到底发生了什么吗?

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

实际上,您应该这样做:

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

通过这种方式,您可以向动画传递一个函数,而不是一个已经计算过的表达式。

当您单独放置一个函数名时,它只向函数求值(函数名本质上只是一个变量,其值就是函数)

当你在一个函数名后面加括号时,意味着在那个时候用给定的参数调用该函数。该值是函数返回的值

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

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

您的第二个方案缺少一个右大括号。它没有注意到任何缺少的大括号。我现在添加了它。它应该会给出一个相当严重的语法错误:-)
()
在函数名引用之后始终调用该函数。o好的,谢谢。我在找丢失的支架;你是说括号。