试图了解语法在回调函数中的工作原理
trying to understand how the syntax works in the call back functions
我正在学习回调函数,但我对以下两个函数的语法感到困惑。它们都给出相同的结果,但是用不同的语法编写,但是,为什么第一个不需要 "return result" 而第二个需要呢?是因为 "callback(result)" 已经 return 编辑了函数,不需要 return 了吗?但是对于第二个合并函数,由于回调是on"array1[i], array2[i]",结果需要returned?
如果我的理解不正确,请指正。谢谢。
var merge = function(array1, array2, callback){
var result = [];
for (var i = 0; i < array1.length; i++) {
result[i] = array1[i] + array2[i];
};
callback(result)
};
var x=merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) {console.log(merged)});
var merge = function(array1, array2, callback) {
var result = [];
for (i=0; i < array1.length; i++) {
result[i] = callback(array1[i], array2[i]);
}
return result;
};
var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){
return a + b;
});
console.log(x);
在第二个中,您正在记录函数的 returned 值。
在第一个中,您记录每次合并发生时的值,但不查看 returned 值。如果您记录了 return 值,您会看到它是未定义的,并且在合并函数完成执行后没有实际更改任何值。
回调函数不必 return 值。但请注意,您的第一个版本没有 returning 任何东西。你的第二个版本是 returning 一个值。如果您只查看 returned 值,那么它会告诉您差异。第一个版本是 undefined
,第二个版本是 [6,8,10,12]
。差异是 return 的结果。由于回调函数中的 console.log,第一个看起来只是 returning 一个值。
简化这两段代码会有所帮助。让我们考虑 "making" 和使用字符串 "hello".
的两种不同的(非常人为的)方式
您的第一个示例(或多或少)等同于以下内容:
function makeHello(callback) {
callback("hello");
}
makeHello(function (str) {
alert(str) // callback consumes the value produced by the function
});
我们有一个函数可以生成一个值,并通过将其传递给回调函数来使该值可供使用。这主要用于异步生成值且无法从函数返回的情况。
您的第一个示例,merge
函数包含连接两个数组的逻辑(在本例中为 +
运算符),并自行生成完全合并的结果。然后它通过回调函数使您可以使用该值。
您的第二个示例将回调用于完全不同的目的;它的回调参与帮助产生最终值:
function makeHello(callback) {
return callback() // callback produces the value we need to return
}
alert(makeHello(function () {
// callback isn't *consuming* the result, its helping to *produce* the result
return "hello"
}));
生成后,函数通过简单地返回值来传递值。同样,这是唯一可能的,因为值是以同步方式产生的。
在您的第二个示例中,merge
函数实际上并不知道如何合并两个数组。您的回调负责执行此操作; merge
函数只知道如何找到正确的对并将它们传递到您的回调中。
回调只是您传递给另一个函数的函数,因此它可以使用它来 return 返回给您的值(您的第一个示例)或能够自定义其中的某些部分接收函数(你的第二个例子)。
如果您不使用回调,您的代码将如下所示:
var merge = function(array1, array2, callback) {
var result = [];
for (var i = 0; i < array1.length; i++) {
result[i] = array1[i] + array2[i];
};
console.log(result); // this is your callback code
};
merge([1, 2, 3, 4], [5, 6, 7, 8]);
对于第一个示例,不需要 return,因为 merge 函数会将其提供给 callback 而不是return正在处理它。所以 var x = 部分没有用,调用后 x 将是未定义的。
您的第二个示例如下所示:
var merge = function(array1, array2, callback) {
var result = [];
for (i = 0; i < array1.length; i++) {
result[i] = a + b; // your callback code gets executed here
}
return result;
};
var x = merge([1, 2, 3, 4], [5, 6, 7, 8]);
console.log(x);
对于这种情况,merge 函数实际上 returns 值但使用 回调(这不是真的你所谓的回调,它只是一个函数)来自定义它合并数组中的值的操作。
我正在学习回调函数,但我对以下两个函数的语法感到困惑。它们都给出相同的结果,但是用不同的语法编写,但是,为什么第一个不需要 "return result" 而第二个需要呢?是因为 "callback(result)" 已经 return 编辑了函数,不需要 return 了吗?但是对于第二个合并函数,由于回调是on"array1[i], array2[i]",结果需要returned?
如果我的理解不正确,请指正。谢谢。
var merge = function(array1, array2, callback){
var result = [];
for (var i = 0; i < array1.length; i++) {
result[i] = array1[i] + array2[i];
};
callback(result)
};
var x=merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) {console.log(merged)});
var merge = function(array1, array2, callback) {
var result = [];
for (i=0; i < array1.length; i++) {
result[i] = callback(array1[i], array2[i]);
}
return result;
};
var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){
return a + b;
});
console.log(x);
在第二个中,您正在记录函数的 returned 值。
在第一个中,您记录每次合并发生时的值,但不查看 returned 值。如果您记录了 return 值,您会看到它是未定义的,并且在合并函数完成执行后没有实际更改任何值。
回调函数不必 return 值。但请注意,您的第一个版本没有 returning 任何东西。你的第二个版本是 returning 一个值。如果您只查看 returned 值,那么它会告诉您差异。第一个版本是 undefined
,第二个版本是 [6,8,10,12]
。差异是 return 的结果。由于回调函数中的 console.log,第一个看起来只是 returning 一个值。
简化这两段代码会有所帮助。让我们考虑 "making" 和使用字符串 "hello".
的两种不同的(非常人为的)方式您的第一个示例(或多或少)等同于以下内容:
function makeHello(callback) {
callback("hello");
}
makeHello(function (str) {
alert(str) // callback consumes the value produced by the function
});
我们有一个函数可以生成一个值,并通过将其传递给回调函数来使该值可供使用。这主要用于异步生成值且无法从函数返回的情况。
您的第一个示例,merge
函数包含连接两个数组的逻辑(在本例中为 +
运算符),并自行生成完全合并的结果。然后它通过回调函数使您可以使用该值。
您的第二个示例将回调用于完全不同的目的;它的回调参与帮助产生最终值:
function makeHello(callback) {
return callback() // callback produces the value we need to return
}
alert(makeHello(function () {
// callback isn't *consuming* the result, its helping to *produce* the result
return "hello"
}));
生成后,函数通过简单地返回值来传递值。同样,这是唯一可能的,因为值是以同步方式产生的。
在您的第二个示例中,merge
函数实际上并不知道如何合并两个数组。您的回调负责执行此操作; merge
函数只知道如何找到正确的对并将它们传递到您的回调中。
回调只是您传递给另一个函数的函数,因此它可以使用它来 return 返回给您的值(您的第一个示例)或能够自定义其中的某些部分接收函数(你的第二个例子)。
如果您不使用回调,您的代码将如下所示:
var merge = function(array1, array2, callback) {
var result = [];
for (var i = 0; i < array1.length; i++) {
result[i] = array1[i] + array2[i];
};
console.log(result); // this is your callback code
};
merge([1, 2, 3, 4], [5, 6, 7, 8]);
对于第一个示例,不需要 return,因为 merge 函数会将其提供给 callback 而不是return正在处理它。所以 var x = 部分没有用,调用后 x 将是未定义的。
您的第二个示例如下所示:
var merge = function(array1, array2, callback) {
var result = [];
for (i = 0; i < array1.length; i++) {
result[i] = a + b; // your callback code gets executed here
}
return result;
};
var x = merge([1, 2, 3, 4], [5, 6, 7, 8]);
console.log(x);
对于这种情况,merge 函数实际上 returns 值但使用 回调(这不是真的你所谓的回调,它只是一个函数)来自定义它合并数组中的值的操作。