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