2015-09-30 4 views
1

Я изучаю функции обратного вызова, но я смущен синтаксисом для следующих двух функций. однако все они дают один и тот же результат, но написаны в другом синтаксисе, однако, почему первый не нужно «возвращать результат», а второй? заключается в том, что, поскольку «обратный вызов (результат)» уже возвратил функцию, и нет необходимости возвращаться? но для второй функции слияния, поскольку обратный вызов находится на «array1 [i], array2 [i]», результат должен быть возвращен?, пытаясь понять, как работает синтаксис в функциях обратного вызова

Пожалуйста, исправьте меня, если мое понимание неверно. Благодарю.

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); 
+1

Да, эти два отрывка делают две очень разные вещи. Первый просто добавляет значения и передает окончательный результат обратному вызову. Второй на самом деле вызывает обратный вызов для получения объединенного значения (т. Е. Он не должен быть только добавлением), а затем напрямую возвращает результат. –

ответ

3

Это поможет, если вы упростите две части кода. Давайте рассмотрим два разных (чрезвычайно надуманных) способа «создания» и потребления строки «привет».

Ваш первый пример (более или менее) эквивалентно следующему:

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 просто знает, как найти правильные пары и передать их в ваш обратный вызов.

1

Во втором, вы записываете возвращаемое значение функции.

В первом вы регистрируете значение каждого слияния по мере их возникновения, но не смотрите на возвращаемое значение. Если вы зарегистрировали возвращаемое значение, вы увидите, что оно не определено, а также что никакие значения не были фактически изменены после завершения выполнения функции слияния.

Функции обратного вызова не обязаны возвращать значения. Но обратите внимание, что ваша первая версия ничего не возвращает. И ваша вторая версия возвращает значение. Если бы вы посмотрели только на возвращаемое значение, это продемонстрировало бы вам разницу. Первая версия будет undefined, вторая - [6,8,10,12]. Разница - результат возврата. Он выглядит только так, как первый возвращает значение из-за console.log в функции обратного вызова.

1

Обратный вызов - это просто функция, которую вы передаете другой функции, чтобы она могла использовать ее для возврата значения вам (ваш 1-й пример) или для настройки некоторой части этой функции приема (ваш второй пример).

Если вы не использовать обратные вызовы ваш код будет выглядеть следующим образом:

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]);

Для 1-го примера возврата не требуется, потому что слияние функция даст, что обратный вызов вместо его возврата. Таким образом, var x = part бесполезно, 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);

В этом случае слияние функция фактически возвращает значение, но использует обратного вызова (это на самом деле не что вы вызываете обратный вызов, это просто функция), чтобы настроить, какое действие он объединяет значения в массиве.

+0

Как я могу сделать вторую функцию слияния реальным обратным вызовом, который не просто настраивает массив – Danny

+0

, вы можете передать столько функций, сколько хотите функции слияния в качестве параметров. – toskv

Смежные вопросы