我希望能够清楚地了解javascript中的回调函数,以下是我的2个问题,这些问题可能非常基本,但我想这有助于澄清回调的概念:
1.所有回调函数是否异步执行,这意味着即使任务不是很慢,它们也会在一个单独的进程上运行并被放回到事件队列中以便稍后执行?
2.在下面的示例代码中,有3个函数,2个数字的简单添加函数,调用add函数的普通函数和使用回调函数的函数,结果在控制台中相同,现在,除了速记和匿名函数的优点外,calculate()和calculate1()在执行方面有何不同。
我也经历过这个话题 Why use callback in JavaScript, what are its advantages?其中解释了为什么我们需要专门针对异步编程的回调,但是我想知道所有的 处理简单或复杂的回调,在我下面的代码中我使用简单的回调不是像setTimeOut或setInterval这样的异步函数,它只是一个回调,所以它将如何以不同的方式处理或执行。 三江源!
function add(x,y){
return x + y;
}
function calculate(x,y,compute){
return compute(x,y);
}
function calculate1(x,y){
return add(x,y);
}
var a = calculate(5,4,function(x,y){return add(x,y)});
var b= calculate(5,4,add);
var c= calculate1(5,4);
console.log(a);
console.log(b);
console.log(c);
答案 0 :(得分:1)
所有回调函数是否异步执行[...]?
是否异步处理回调取决于接受回调的函数何时调用它们。你可以说你的calculate
函数同步调用它的回调。传递给calculate
的匿名函数在评估下一行之前执行,就像在下面的代码片段中一样:
function callCallback (cb) {
cb();
}
callCallback(function () {
console.log('A'); // called first
});
console.log('B'); // called second
正如您所看到的,尽管采用了回调函数,callCallback
“阻止”执行。
实际上,将函数作为参数传递给其他函数无关异步。但是,这很方便,在处理异步任务时经常使用。
那应该回答你的第一个问题。第二个问题有点不清楚。
当然,有些函数不会阻止代码的执行:
function callCallback (cb) {
setTimeout(cb, 10);
}
callCallback(function () {
console.log('A'); // called second
});
console.log('B'); // called first
这是差异,你似乎已经理解了。
答案 1 :(得分:0)
1.所有回调函数是否异步执行,这意味着即使任务不是很慢,它们也会在一个单独的进程上运行并被放回到事件队列中以便稍后执行?
如果没有阻止javascript方法,则立即执行回调。
2.在下面的示例代码中,有3个函数,2个数字的简单添加函数,调用add函数的普通函数和使用回调函数的函数,结果在控制台中相同,现在,除了速记和匿名函数的优点之外,calculate()和calculate1()在执行方面有何不同。
它们几乎相同,但有一些基本的区别。
1)一个是纯度计算纯,而calculate1是不纯的。 基本上,Calculate仅适用于传递的值,这使得它可以预测。
function calculate(x,y,compute){
return compute(x,y);
}
这里所有的x,y,compute都在计算自己的范围内自给自足。它不必担心外部范围包含什么。
但另一方面,calculate1假定某处会有添加功能而我们无法控制它是怎么回事。
function calculate1(x,y){
return add(x,y);
}
这里我们不知道添加是什么,当调用compute时它试图找到在它之外添加的内容。这就是为什么在函数式编程中回调是必须的。
2)另一个主要区别是回调中的 this ,这在你的例子中没有显示。
使用 回调时, 是一个令人头疼的问题。所以如果你想掌握回调,我建议你更多地考虑一下。 this link在回调中有 this 的最佳解释之一。我强烈建议你去看看。