什么是 callback Link to heading
A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action.
callback 函数执行过程的想象 Link to heading
所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到 回调函数管理器的队列 里面。 待回调函数被触发调用的时候,对应的回调函数的代码才会从管理器队列 取出来并自动执行(激活回调函数的代码),实现异步的编程效果。
一个小问题 Link to heading
如同上面的引用说的, callback 被触发, 那么回调函数代码会被从队列里面 pull 出来, 自动执行/激活.
但是如果回调函数的代码返回的还是回调函数, 也就是说所谓 callback hell 的情况它会不会一路执行到底呢? 还是说就执行一层然后返回新的回调呢? 我特意做了一个实验
实验代码 Link to heading
function levelOne(f) {
console.log('print one time\n');
return function(x) {
return f(x);
}
}
var level = levelOne(levelOne);
var wrapper = level;
wrapper();
如果说它是一层的, 那么结果应该是打出一次print one time. 如果一路执行到底, 那么应该打出来两次.
实验结果 Link to heading
print one time
print one time
print one time
小结 Link to heading
像是 callback hell 这种情况下, 只要触发了最外一层 callback 函数, 那么 callback 会 链式 的一直执行到底. 机制原因 未知.
这篇文章的作者把这个链式的 callback 称为 嵌套回调.
再来回看廖大神的阿隆索邱琪的例子 Link to heading
我们现在只单单看他的zero 和 one 的定义, 看看我们对回调函数理解有没有好一点.
// 定义数字0:
var zero = function (f) {
return function (x) {
return x;
}
};
// 定义数字1:
var one = function (f) {
return function (x) {
return f(x);
}
};
我们发现当 zero() 被执行的时候(盯紧 f 来看), 它的 f 被执行了0次.
当 one() 被执行的时候, 它的 f 被执行了1次.
那么依次类推, two 的定义我们就能写出来了
var two = function(f) {
return function(x) {
return f(f(x));
}
}
how about three?
var three = function(f) {
return function(x) {
return f(f(f(x)));
}
}
这种定义来说, 一旦最外层回调函数被触发, 那么它会链式的一直执行下去. 所以说实际上 f 执行了几次, 它就是几.
小结 Link to heading
本来以为 callback 看懂了, 最近看 react 的东西, 发现 callback 还是不懂, 而且 callback 貌似异常重要, 所以在此记录一下.