getting-started-with-javascript icon indicating copy to clipboard operation
getting-started-with-javascript copied to clipboard

既然可以在函数中直接调用另一个函数,何必还要有回调函数?

Open MyColourfulLife opened this issue 6 years ago • 4 comments

// 间接返回通道 // 采购食物的函数

function buyFoods(callback) {
  console.log('采购原料和菜');
  var foodsList = ['fish', 'egg', 'meat'];
  callback(foodsList);
}

// 调用者的代码片段

function callback(foodsList) {
  console.log(foodsList);
}
buyFoods(callback);

// 直接调用 // 采购食物的函数 注意没有参数

function buyFoods() {
  console.log('采购原料和菜');
  var foodsList = ['fish', 'egg', 'meat'];
  callback(foodsList);
}

// 调用者的代码片段

function callback(foodsList) {
  console.log(foodsList);
}

buyFoods()

这两个调用结果完全一样。 那么既然结果完全一样,为什么还要有回调函数,何不直接调用呢?既生瑜何生亮!!!

MyColourfulLife avatar Aug 28 '17 09:08 MyColourfulLife

你这个好像不存在直接调用和间接调用吧,都是直接调用吧?还是我理解的不对呀?

发自网易邮箱大师

在2017年8月28日 17:31,MyColourfulLife[email protected] 写道:

// 间接返回通道 // 采购食物的函数

function buyFoods(callback) { console.log('采购原料和菜'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); }

// 调用者的代码片段

function callback(foodsList) { console.log(foodsList); } buyFoods(callback);

// 直接调用 // 采购食物的函数 注意没有参数

function buyFoods() { console.log('采购原料和菜'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); }

// 调用者的代码片段

function callback(foodsList) { console.log(foodsList); }

buyFoods()

这两个调用结果完全一样。 那么既然结果完全一样,为什么还要有回调函数,何不直接调用呢?既生瑜何生亮!!!

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

huyong007 avatar Aug 28 '17 10:08 huyong007

你能思考这个问题,我觉得你就差不多懂了很多了。

  1. 如果是同步函数,直接返回结果肯定比间接返回结果要好。思路的清晰度和资源消耗方面都要好。
  2. 如果是异步函数,就必须要使用间接返回。

xugy0926 avatar Aug 28 '17 12:08 xugy0926

我在上课的时候联想到的一个例子,包括直接、间接、异步,和你的问题有关,不是特别准确(文末有总结),供参考:

受老师的“老板和秘书打电话、发微信”例子启发,想到一组送快递的例子。

例子1:

快递小哥打电话给我:“你好,XX快递,在AA大厦楼下,麻烦来取一下。”

我:“好的,请等一会。”

挂了电话,我喝一口水,换鞋、拿钥匙,顺便照了下镜子,关门下楼。

我来到楼下,等待中的小哥递给我快件,事情结束。

例子2:

快递小哥打电话给我:“你好,XX快递,在AA大厦楼下,麻烦来取一下。”

我:“楼下大厅有个丰巢快递柜,请放在里面。”

过了一会,我下楼来到快递柜,看着小哥放快件进去,待他转身,我打开柜箱,取出快件。

小哥:……

例子3:

快递小哥打电话给我:“你好,XX快递,在AA大厦楼下,麻烦来取一下。”

我:“抱歉,我这会正在听JS直播课,走不开。楼下大厅有个丰巢快递柜,请放在里面。”

小哥:“好的,我发完其他人的再放,一会记得来取。”

小哥和我各自做事,互不耽搁。

等到半小时后,我下楼取了快递,心中暗想:“有了快递柜,我就不用停下手里的活赶下去,真方便。”

结语

显然,第一个例子是直接调用,第二个是间接调用,第三个是异步处理,其中快递柜就是传递的通道。我理解老师举间接调用例子的目的是为了从直接调用到异步处理的过渡。在上述的例子2中,我不直接去小哥那取快件,而是在快递柜等他放进去再取很奇怪。这也就突出了例子3比例子1多一个间接通道的好处。

例子1中,我特意描述了从挂电话到取件的过程,是为了营造出“我(这个函数)在这期间有一些处理过程(函数体)”的氛围。不过总体还是觉得和上课所说映射不准确,大家先领会精神,再提出改进建议吧。

mdqsky avatar Aug 28 '17 14:08 mdqsky

@mdqsky 理解老师举间接调用例子的目的是为了从直接调用到异步处理的过渡。 => 你太了解我了哈哈。

xugy0926 avatar Aug 29 '17 02:08 xugy0926