2015-06-13 1 views
2

Если у меня есть код ниже, где я передаю две функции в качестве параметров в функцию sayHi, это пример обратного вызова?Функции передаются как параметры, всегда обратные вызовы? JavaScript

Я замечаю, что есть два способа запуска этих «функций параметров»: либо, как показано ниже, я называю функции, в которых они определены (в качестве аргументов), или альтернативно, где я вызываю параметр в функции sayHi. Разве это будет разница между обратным вызовом и анонимной функцией?

function sayHi(name, testForTrue) { 
    if (testForTrue == true) { 
     console.log(name); 
    } 
} 

sayHi(function() { 
    return 'Zach' 
}(), function() { 
    return true; 
}()); 

Другой способ получить тот же результат, как показано ниже. В этом случае я оцениваю функции в другое время? Есть ли какая-то практическая разница между этими двумя?

function sayHi(name, testForTrue) { 
    if (testForTrue() == true) { 
     console.log(name()); 
    } 
} 

sayHi(function() { 
    return 'Zach' 
}, function() { 
    return true; 
}); 
+0

звучит так, будто вы слишком усложняете вещи, чего вы пытаетесь достичь в примере? – user1620090

+0

Просто более глубокое понимание того, как работает JavaScript, чем в настоящее время. –

+0

Учитывая первый пример, это не «обратные вызовы». Обратные вызовы использовались для вызова определяемых пользователем вещей, когда сама вызываемая функция сделала messing. ;) См. @Jamen ниже. Эти функции будут вызваны до вызова фактической функции и будут возвращать значения и передавать их в качестве аргументов функции. –

ответ

3

Да, функции, передаваемые в качестве параметров всегда являются обратными вызовами, даже если намерение состоит в том, что функция называется синхронно (cf Array.prototype.map), а не асинхронно (cf)).

В вашем первом блоке кода вы, конечно же, не передаете функции. У вас есть два вызываемых функциональных выражения, где ключевая часть в этом контексте сразу же вызывается. Выражения функции вызывают в точке, которую они отображают в коде, и только результаты этих выражений передаются в sayHi.

2

В вашем первом примере вы не передаете функции, а значения; другими словами

(function(){ return 3; })() 

только целое число 3.

Это значение, полученное вызовом функции сразу, но это не имеет значения.

Когда вы передаете обратный вызов, это приемник, который будет вызывать его (или передать его какой-либо другой функции), и код будет выполнен позже, а не на сайте вызова.

1

Я думаю, это будет зависеть от того, что ваш callback функция на самом деле.

В ваших примерах все, что вы действительно делаете, возвращает значение. Это не «функция», она возвращает одно фиксированное значение каждый раз.

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

Например, что-то вроде этого было бы то, что я считаю функцию обратного вызова:

function doSomething(callback) { 
    var userInput = prompt("hello, enter a number 1-10"), 
     hasWon = false; 

    if (userInput === "3") hasWon = true; 

    callback(hasWon); 
}; 

с этим при условии, мы можем назвать это так:

doSomething(function(hasWon){ 
    if (hasWon) alert("Congratz! You guessed my lucky number!") 
});