Javascript 将jQuery中的对象作为回调调用,工作不正常

Javascript 将jQuery中的对象作为回调调用,工作不正常,javascript,jquery,Javascript,Jquery,我试图理解关于调用对象的一些东西,但是我遗漏了一些东西。下面我编写了虚拟代码(可以工作),以便说明我的问题。 下面是一些代码 html: 现在,当我点击该按钮时,它工作正常,控制台显示“它工作正常吗?” $('#test').click(function(){ $(this).animate({"font-size": "20"}, 3000, "swing", testObj.text); }); 作为一个测试,当我做同样的事情,但从对象调用中删除括号,只留下它作为 $('#tes

我试图理解关于调用对象的一些东西,但是我遗漏了一些东西。下面我编写了虚拟代码(可以工作),以便说明我的问题。 下面是一些代码

html:

现在,当我点击该按钮时,它工作正常,控制台显示“它工作正常吗?”

$('#test').click(function(){
    $(this).animate({"font-size": "20"}, 3000, "swing",  testObj.text);
});
作为一个测试,当我做同样的事情,但从对象调用中删除括号,只留下它作为

$('#test').click(function(){
    console.log(testObj.text);
});
控制台将它作为一个对象显示给我。Google Chrome中的控制台明确地说
“function testObj.text()”
。从本质上讲,它不会运行代码,而代码中的代码也很好

问题就在这里

当我尝试调用
testObj
对象作为回调方法时,它不起作用

以下是我所拥有的:

$('#test').click(function(){
    $(this).animate({"font-size": "20"}, 3000, "swing",  testObj.text());
});
使用上面的代码,最终发生的是,尽管控制台中出现了“它正在工作吗”,但它不会等到3秒钟后激活回调,只要单击按钮,回调就会立即触发。本质上,这是没有启动回调

现在,当我使用相同的代码,但从对象调用中删除括号时,它就会按照预期工作。动画播放,完成3秒钟后,回调将触发并在控制台上显示“它是否正常工作”

$('#test').click(function(){
    $(this).animate({"font-size": "20"}, 3000, "swing",  testObj.text);
});
综上所述,在第一个示例中,当我删除括号时,控制台将其作为一个对象显示给我,并且没有运行其中的代码,我不理解为什么它现在在删除括号的回调中工作

我的问题是,为什么会发生这种情况? 我在谷歌上走来走去,但甚至不知道我在搜索什么

本质上,这是没有启动回调

将回调设置为(立即)运行testObj.text函数的结果

$(this).animate({"font-size": "20"}, 3000, "swing",  testObj.text);
将回调设置为testObj.text函数

$(this).animate({"font-size": "20"}, 3000, "swing",  testObj.text);
您之前编写的所有代码都让您感到困惑,因为您正在控制台上记录一个函数的结果,该函数不返回值,但在运行时,会记录到控制台本身


从这段代码中,我看不出当您希望将函数用作回调函数以被回调时,您是如何确定传递函数的结果是正确的。传递回调时,传递函数名作为对它的引用。(请理解,在JavaScript中,函数是“一等公民”,可以像任何其他函数一样用作对象。)

所以当你这样做的时候:

var x = someObject.someFunction;
您正在将
x
设置为该函数引用。它允许您将其作为函数执行:

x();
但当你这样做的时候:

var x = someObject.someFunction();
您正在执行函数并将其结果设置为
x
。因此:

$(this).animate({"font-size": "20"}, 3000, "swing",  testObj.text());
执行
testObj.text()。但这是:

$(this).animate({"font-size": "20"}, 3000, "swing",  testObj.text);

不执行该函数。它将函数作为引用传递,jQuery稍后将执行该引用。

答案非常简单

下面是一个基本的
异步函数
添加
a+b
并在完成后调用回调函数的示例

var addition = function(a, b, callback){
  setTimeout(function(){
    callback(a+b);
  }, 0);
}
现在让我们回到你遇到的问题。我想将1+1相加,并在相加结束时调用回调

如果我这样做:

var func = function(result){
  console.log(result);
}

addition(1, 1, func());
回调函数未正确用作回调函数。当然您将它放在了正确的位置,但是
()
表示您希望运行该函数。下面是一步一步运行时发生的情况:

addition(1, 1, func());
  • func()首先被调用,并尝试console.log(result),该结果是未定义的,因为我们在调用函数时从未将其作为参数
  • func()
    没有返回结果,因此
    加法
    中的第三个参数不是
    函数
  • Addition
    最终被调用,但失败,因为
    回调
    不是函数


  • 现在正确的方法是不要添加
    ()
    。这确保在调用添加之前不会调用
    func
    。实际上,您将未调用的函数发送到
    addition
    。当
    添加
    完成时,它是1+1,它将调用
    函数
    (它恰好被命名为
    回调
    ),结果是
    参数

    ,jquery animate function方法采用function()类型作为完整参数。在使用animate的第一个示例中,您正在计算testObj.text()并将该值传递给animate(这会产生输出到控制台的副作用)。在第二个示例中,您实际上正在传递函数。
    addition(1, 1, func());