回调提供了一种扩展功能(或方法)的功能而无需更改其代码的方法。这种方法通常用在模块(库/插件)中,不应更改其代码。
假设我们编写了以下函数,计算给定值数组的总和:
function foo(array) { var sum = 0; for (var i = 0; i < array.length; i++) { sum += array[i]; } return sum; }
现在假设我们要对数组的每个值进行操作,例如,使用进行显示alert()。我们可以在的代码中进行适当的更改foo,如下所示:
function foo(array) { var sum = 0; for (var i = 0; i < array.length; i++) { alert(array[i]); sum += array[i]; } return sum; }
但是,如果我们决定使用console.log而不是alert()呢?显然foo,每当我们决定对每个值进行其他操作时,更改的代码都不是一个好主意。最好选择不更改的代码而改变主意foo。这正是回调的用例。我们只需要稍微更改其foo签名和正文即可:
function foo(array, callback) { var sum = 0; for (var i = 0; i < array.length; i++) { callback(array[i]); sum += array[i]; } return sum; }
现在我们可以foo通过更改其参数来更改其行为:
var array = []; foo(array, alert); foo(array, function (x) { console.log(x); });
在jQuery中,获取JSON数据的方法是异步的。因此,在回调中传递代码可确保在获取JSON之后调用该代码。$.getJSON()
$.getJSON() 语法:
$.getJSON( url, dataObject, successCallback );
代码示例:$.getJSON()
$.getJSON("foo.json", {}, function(data) { // 数据处理代码 });
以下将不工作,因为数据处理代码可能会被调用之前实际接收到的数据,因为该$.getJSON功能需要未指定的时间长,因为它等待JSON不成立调用堆栈。
$.getJSON("foo.json", {}); // 数据处理代码
异步函数的另一个示例是jQuery的animate()函数。由于运行动画需要花费指定的时间,因此有时最好直接在动画之后运行一些代码。
.animate() 语法:
jQueryElement.animate( properties, duration, callback );
例如,要创建淡出动画,然后元素完全消失,可以运行以下代码。注意回调的使用。
elem.animate( { opacity: 0 }, 5000, function() { elem.hide(); } );
这允许在函数完成执行后立即隐藏元素。这不同于:
elem.animate( { opacity: 0 }, 5000 ); elem.hide();
因为后者不等待animate()(异步函数)完成,因此该元素立即被隐藏,从而产生不良效果。