第 3-6 行 。我们有一个新的函数声明,我们在createAdder执行上下文中创建一个变量addNumbers 。这很重要,addnumber只存在于createAdder执行上下文中 。我们将函数定义存储在名为 ``addNumbers``` 的自有变量中 。 第7行,我们返回变量addNumbers的内容 。js引擎查找一个名为addNumbers的变量并找到它,这是一个函数定义 。好的,函数可以返回任何东西,包括函数定义 。我们返addNumbers的定义 。第4行和第5行括号之间的内容构成该函数定义 。 返回时,createAdder执行上下文将被销毁 。addNumbers 变量不再存在 。但addNumbers函数定义仍然存在,因为它返回并赋值给了adder 变量 。 第10行 。我们在全局执行上下文中定义了一个新的变量 sum,先赋值为 undefined; 接下来我们需要执行一个函数 。哪个函数? 是名为adder变量中定义的函数 。我们在全局执行上下文中查找它,果然找到了它,这个函数有两个参数 。 让我们查找这两个参数,第一个是我们在步骤1中定义的变量val,它表示数字7,第二个是数字8 。 现在我们要执行这个函数,函数定义概述在第3-5行,因为这个函数是匿名,为了方便理解,我们暂且叫它adder吧 。这时创建一个adder函数执行上下文,在adder执行上下文中创建了两个新变量 a 和 b 。它们分别被赋值为 7 和 8,因为这些是我们在上一步传递给函数的参数 。 第 4 行 。在adder执行上下文中声明了一个名为ret的新变量, 第 4 行 。将变量a的内容和变量b的内容相加得15并赋给ret变量 。 ret变量从该函数返回 。这个匿名函数执行上下文被销毁,从调用堆栈中删除,变量a、b和ret不再存在 。 返回值被分配给我们在步骤9中定义的sum变量 。 我们将sum的值打印到控制台 。 如预期,控制台将打印15 。我们在这里确实经历了很多困难,我想在这里说明几点 。首先,函数定义可以存储在变量中,函数定义在程序调用之前是不可见的 。其次,每次调用函数时,都会(临时)创建一个本地执行上下文 。当函数完成时,执行上下文将消失 。函数在遇到return或右括号}时执行完成 。最后,一个闭包看看下面的代码,并试着弄清楚会发生什么 。

文章插图
现在,我们已经从前两个示例中掌握了它的诀窍,让我们按照预期的方式快速执行它:
- 第 1-8 行 。我们在全局执行上下文中创建了一个新的变量createCounter,并赋值了一个的函数定义 。
- 第9行 。我们在全局执行上下文中声明了一个名为increment的新变量 。
- 第9行 。我们需要调用createCounter函数并将其返回值赋给increment变量 。
- 第 1-8行 。调用函数,创建新的本地执行上下文 。
- 第2行 。在本地执行上下文中,声明一个名为counter的新变量并赋值为 0;
- 第 3-6行 。声明一个名为myFunction的新变量,变量在本地执行上下文中声明,变量的内容是为第4行和第5行所定义 。
- 第7行 。返回myFunction变量的内容,删除本地执行上下文 。变量myFunction和counter不再存在 。此时控制权回到了调用上下文 。
- 第9行 。在调用上下文(全局执行上下文)中,createCounter返回的值赋给了increment,变量increment现在包含一个函数定义内容为createCounter返回的函数 。它不再标记为myFunction````,但它的定义是相同的 。在全局上下文中,它是的标记为labeledincrement``` 。
- 第10行 。声明一个新变量 c1 。
- 继续第10行 。查找increment变量,它是一个函数并调用它 。它包含前面返回的函数定义,如第4-5行所定义的 。
- 创建一个新的执行上下文 。没有参数,开始执行函数 。
- 第4行 。counter=counter + 1 。在本地执行上下文中查找counter变量 。我们只是创建了那个上下文,从来没有声明任何局部变量 。让我们看看全局执行上下文 。这里也没有counter变量 。Javascript会将其计算为counter = undefined + 1,声明一个标记为counter的新局部变量,并将其赋值为number 1,因为undefined被当作值为 0 。
- 第5行 。我们变量counter的值 1,我们销毁本地执行上下文和counter变量 。
- 回到第10行 。返回值1被赋给c1 。
- 第11行 。重复步骤10-14,c2也被赋值为1 。
- 第12行 。重复步骤10-14,c3也被赋值为1 。
- 第13行 。我们打印变量c1 c2和c3的内容 。
你自己试试,看看会发生什么 。你会将注意到,它并不像从我上面的解释中所期望的那样记录1,1,1 。而是记录1,2,3 。这个是为什么?
推荐阅读
-
『博智客』美国暗自抓狂,联合国传来一个又一个好消息!中国喜上眉梢
-
养生小王医师|特别是第五种,坚持下去宝宝更聪明,这几种食物坚决不给宝宝吃
-
-
物业|女主睡的是我的床?女子自家多年未住别墅成剧组拍摄地
-
红叶禅师|葵花宝典与辟邪剑谱:为什么欲练神功,必先自宫?
-
刘姚尧的文字城堡|大师赛决赛重演?,斯诺克大赛诞生死亡之组?3名TOP18或同室操戈
-
萝卜的风情|闺蜜老公一定会表现的健谈,幽默笑话:闺蜜和老公逛街
-
掘墓追电影|财运翻倍,发财赚大钱的4星座,扬眉吐气大翻身!,11月开始
-
-
-
好奇的萌娃控|原因是什么?多是因为以下3点,越来越多的80、90后成“啃老族”
-
心理学,松子,早点|越是心地善良的人,往往命越不好?心理学:善良的3大缺点,早点知道更好
-
-
贾玲机场登机照曝光,风格大变令网友惊呼:世上再无贾玲!
-
北青网综合|紧急通告:河北急寻2名无症状感染者接触人员
-
时尚丽人风行|50岁李嘉欣真放得开!穿透视阔腿裤露内裤太性感,毫不避讳儿子
-
吴晓求:如果不开放,中国资本市场的改革力度和效果将会是有限的
-
-
北京时间|每年平均捕杀800头,丹麦法罗群岛数百鲸鱼和海豚被捕杀,人口不到5万
-
岳飞和成吉思汗是不是一个时候的人?如果成吉思汗和岳飞是一个年代谁更厉害