2018.03.06
#
1、故事背景
阿猿是张家界的人,这一年上高三,计划考上北京大学,去北京念书。
- 知识类比:如果‘阿猿’比喻为‘函数’的话,张家界这个区域可以类比为‘函数作用域’。就是他出生(定义)的时候,他的出生地就已经固定了。(备注:es5 是函数作用域,es6才开始有了块作用域。)
2、故事发展:
这一年的高考阿猿考的很不错,结果考上了北京大学,不久后就接到了录取通知书。8月底阿猿父亲准备开车送他去北京上学,阿猿提前准备了东西(包括衣服鞋子,吃的、书等)。
- 知识类比:如果把‘录取通知书’类比为‘函数调用’,那么‘阿猿做的准备工作’就可以类比为‘执行上下文’。(问题1:在“准备工作”中完成了哪些工作?)
3、故事发展
阿猿到了北京大学,将录取通知书给老师查看之后,确定阿猿就是本人。就带着阿猿到宿舍,阿猿把行李拆开,摆放东西。
- 知识类比:‘阿猿拆开行李’就类比‘执行上下文环境被销毁’。整个‘调用’过程,结束。
总结:
1、问题1:在“准备工作”中完成了哪些工作?
- 变量、函数表达式——变量声明,默认赋值为undefined;
- this——赋值;
- 函数声明——赋值;
这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。
2、函数在定义的时候(不是调用的时候),就已经确定了函数体内部自由变量的作用域。如何理解?如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。又如何理解?
阿猿在张家界出生的时候,阿猿的出生地就已经固定了(就是张家界)。之前说把‘阿猿’类比为函数,‘函数体内部自由变量’类比于‘父亲准备的北京大学奖金’(这个奖金只有考上北京大学,才能使用),这个奖金的的作用域肯定也就在张家界了。
要找到阿猿的出生地张家界区域内的‘父亲准备的北京大学奖金’。唯一的办法,就是获取一个‘北京大学录取通知书’。阿猿在准备行李的时候,只要把‘北京大学录取通知书’这个调用拿出来,就能获取‘父亲准备的北京大学奖金’的值,。说这么多,也就是说要获取作用域下变量的值,必要要在调用函数的时候,进入执行上下文才能获取。
- 链接:什么是“自由变量”。
3、函数每被调用一次,都会产生一个新的执行上下文环境。如何理解?
- 阿猿高考结束后,被‘调用’到北京大学读书,他做的准备的工作(书本、衣服鞋子、准备认识新同学)。
- 阿猿大学毕业之后,被‘调用’到上海工作,他做的准备工作(被子、正装皮鞋)。
- 总结:通过这个类比,是不是看到,在‘调用’的时候,阿猿就要做一个新的‘准备工作’。所以:函数每被调用一次,都会产生一个新的执行上下文环境。
2018.03.06 有些类比不是很恰当,之所以这么类比,也是希望对小伙伴们有用,因为作用域和执行上下文,确实不好理解。哪里有不正确的地方,请指出哦。谢谢!