xra*_*alf 6 javascript function callback
在Javascript中,有可能定义一个函数X并将其作为参数传递给另一个函数Y.
这样的函数X称为a callback function.
你能解释为什么在一些明显的例子中使用回调函数是有用的(例如发送一些小提琴链接和演示)?我可以看到一个有用的东西,它的代码可读性,但我不确定,因为带回调的代码看起来更复杂.
唯一有用的是它在浏览器环境中的使用和AJAX中的异步执行?那么另外的Javascript实现(例如Rhino)呢?回调在那里也有用吗?或者它们的用处是否仅取决于执行Javascript的环境?
谢谢
回调很有用,因为它们允许您使用代码 "配置"函数.
这方面的典型示例是一个排序功能,它允许您指定自己的排序标准.我将使用一个函数,它根据某些条件返回数组的最小值,因为它比排序更简单,但它仍然可以作为一个例子:
function min(collection, property) {
if (collection.length == 0) {
return null;
}
var minIndex = 0;
var minValue = collection[0][property];
for (var i = 1; i < collection.length; ++i) {
if (minValue > collection[i][property]) {
minValue = collection[i][property];
minIndex = i;
}
}
return collection[minIndex];
}
var items = [
{ name: "John", age: 20 }, { name: "Mary", age: 18 }
];
alert(min(items, 'age').name); // prints "Mary"
Run Code Online (Sandbox Code Playgroud)
看到这个代码运行.它有什么问题?
问题是虽然我们为了创建一个可配置的min函数做了一些努力(它根据我们指定的任何属性找到了最小值),但它在一般意义上仍然非常有限,因为它只能根据一个属性找到最小值.
如果我们的数据是这样的怎么办?
var items = [ "John/20", "Mary/18" ];
Run Code Online (Sandbox Code Playgroud)
这不再是一个对象数组,而是一个格式化字符串数组.它具有与原始集合相同的数据,但具有不同的结构.因此,原始min功能不能用于处理它.
现在我们可以编写另一个版本的min字符串而不是对象,但这将是毫无意义的(有无数种方式来表示相同的数据).对于一个特定情况,这可能是一个快速而肮脏的解决方案,但考虑到库编写器的问题:他们如何编写一个对每个人都有用的函数,而不知道每种情况下数据的结构如何?
回击救援
简单:min允许用户指定如何从数据中提取条件,从而使功能更强大.这听起来非常像"给出功能代码以从数据中提取标准",这就是我们要做的事情.min将接受回调:
function min(collection, callback) {
if (collection.length == 0) {
return null;
}
var minIndex = 0;
var minValue = callback(collection[0]);
for (var i = 1; i < collection.length; ++i) {
if (minValue > callback(collection[i])) {
minValue = callback(collection[i]);
minIndex = i;
}
}
return collection[minIndex];
}
var items = [ "John/20", "Mary/18" ];
var minItem = min(items, function(item) {
return item.split('/')[1]; // get the "age" part
});
alert(minItem);
Run Code Online (Sandbox Code Playgroud)
现在终于我们的代码可以重用了.我们可以轻松地将其配置为以最小的努力使用第一种和第二种类型的数据.
请参阅启用回调的函数处理两种类型的数据.这是我们通过允许用户以回调的形式提供代码作为我们的函数的一部分运行而获得的极大灵活性的结果.
回调的另一个主要用途是启用异步编程模型.这在您计划完成操作但在操作完成之前不希望程序停止运行的所有情况下都很有用.
为了使其工作,你为操作提供了一个回调函数,并有效地告诉它:为我做这项工作,当你完成后,给我回电话.然后,您可以自由地继续做任何您喜欢的事情,因为您知道当结果可用时,您指定的功能将运行.
这在使用AJAX的Web中最为明显:您向Web服务器发出请求,并在收到响应时以某种方式对其进行操作.你不想等待在现场的反应,因为它可能需要大量的时间(例如,如果存在连接问题),你不希望你的程序没有响应了所有的时间.
有关AJAX回调的示例,请参阅jQuery load函数的文档.