Skip to content

Latest commit

 

History

History
130 lines (88 loc) · 6.11 KB

2018-03-09_理解_函数类型.md

File metadata and controls

130 lines (88 loc) · 6.11 KB

函数分类

- 分类

目前接触到的函数类型,立即函数回调函数同步函数异步函数顺序调用嵌套调用,它们的相互关系是怎么样的?怎么区分它们?  

这几天睡醒过来就会卡在这个问题,看别的内容也会一直想到。没办法,还是得赶快整理一下。 也因为,自己觉得这些基础的函数,太重要了。

分别了解它们时,好像都能逐个理解。但全部看过后,再回忆这些名词代表的函数例子到底有什么异同,却又绞得像浆糊。昨天之前其实连顺序调用这个名词都忘记了。看的时候明白,但是没有跳出来理解,当然一离开那部分内同时看到别的,就把前面的忘记了。今天早上一起来就拿昨天抄的各个例子起来对比着看,看到“嵌套调用”的“调用”,突然发现他们是各有侧重的。试着整理看看。

这六种函数,其实是按不同层面来分类的,采用不同的分类方式; 不同分类的函数之间是没有从属关系的。

函数分类 分类方式
顺序调用和嵌套调用 按调用函数的时机
同步和异步 按执行命令的时机
立即和回调(或间接调用) 按输出结果/返回结果的时机

这样看一下子就清晰了很多,为深入理解找到切入点。

然后再分析和整理,
包括,虽然没有从属关系,但相互重叠的部分是什么关系,就像不同集合之间的重叠部分是什么。

  • 顺序调用和嵌套调用: 按调用函数的时机。
    是逐个函数分别调用,还是在一个函数里面,调用另一个函数。

  • 同步和异步:按执行命令的时机。
    是一个函数执行完再开始另一个函数的执行;还是一个函数执行的同时,另一个函数也在执行,两者有同时进行的时间。这里要注意,第二种,异步函数,虽然有同时执行,但是总有一个函数是先行,因为先行函数引出接下来同时执行的另一个函数。 (以下内容会再讲到。)

  • 立即和回调(或间接):按输出结果/返回结果的时机。
    是函数执行时马上输出结果,还是通过参数代表的回调函数执行时才输出结果。

有关相互关系的几点

- 同步的间接返回是为了引入异步

至少,看到笔记上,老师在第9课里说的“同步的间接返回是为了引入异步”,才算看出点逻辑上的“为什么”,才知道之前的似懂非懂原来是看到“例子/现象”里的函数们长什么样子,但本质上分类不清函数间的关系,导致逻辑上串不起来。这一个句子就说了仨分类,我的天。

相关代码如下:

//  间接返回 和 立即返回 的 区别

// ---(秘书)被调用的函数 ---
console.log(1);
function checkFlightSchedule(callback) {
  console.log(2);
  callback('8:00'); //回调
  return '查完了';  //立即返回结果,立即函数,同步
  console.log(3);
}

// ---(老板)属于调用者的代码 ---
console.log(4);
function callback(startTime) {
  console.log(5);
  console.log(startTime);
  console.log(6);
}

console.log(7);
var result = checkFlightSchedule(callback); //老板进行“同步调用(return结果)”:你查到后通过callback/回调输出/间接返回,把结果给我。
console.log(result);
console.log(8);  

如果没有理解错的话,
result调用同步函数checkFlightSchedule(),把callback函数作为参数,通过callback函数间接返回才打印结果。那么异步在哪里呢?什么函数在同时进行?是否异步藏在参数里?是的话,“引入异步”就类似callback这样的函数里是被写入了其他执行命令。
待验证。

- 异步再快,也快不过顺序执行

这句话正好似乎也说明,为什么“异步再快,也快不过顺序执行”。   因为,同步在前面被顺序执行后,到某个点才引入异步的。先有同步的顺序执行,才进行异步的执行。   或者可以说,异步再快,也快不过调用它的函数。

但是,“引入异步”一定是上面代码的做法吗?如果还有别的做法,那么对那句话的理解还不够充分,还要找其他例子。
待验证。

- 同步调用的函数,不管通过什么方式给出结果,它一定有一个立即返回的结果

另外,关于这三类的关系,
老师在第9课里说“同步调用的函数,不管通过什么方式给出结果,它一定有一个立即返回的结果。”  

(正好对应了犀牛书里5.6节关于return的解释。)

也就是说, 同步函数,一般也是立即函数的结构,就是要用return expression语句; 不然调用结果就是undefined。即便通过间接返回,也是需要return一个结果给调用后显示。 (因为同步调用时,用的是定义表达式。此时,函数就处在一个变量的位置; 简单地说,函数是变量。对应回上面5.6节的理解。)

var result = checkFlightSchedule(callback);

理解待验证。


暂时先这样  

2018-03-12

关于调用,除了调用时机,还应考虑调用方式。   调用方式,分为定义表达式调用 和 语句调用。 就像定义时一样。
var result = checkFlightSchedule(callback)

checkFlightSchedule(callback)
  不用还有些不肯定。

这样,从三个分类,增加为四个分类

因为调用方式跟其他三类的六个元素都没有必然联系,是可以视情况独立使用的角度;可分为两种元素,如上。

定义表达式调用

return是定义表达式调用的必需。
因为在定义表达式中,函数作为变量的值。虽然 ,这个值需要经过函数体内命令执行后才产生真正的数据; 如果没有产生数据结果,即,没有定义变量。因此会返回undefined。

关于定义表达式的说法, 是不是 var x = a{}也叫做直接量方式?