1 00:00:00,764 --> 00:00:03,070 既然你已经学会了基本的函数, 2 00:00:03,070 --> 00:00:07,396 那么我现在就要加一点点难度了: 3 00:00:07,396 --> 00:00:10,984 局部变量与全局变量的差别。 4 00:00:11,374 --> 00:00:14,179 你现在可能还不明白这两个名词的意思, 5 00:00:14,179 --> 00:00:16,364 所以我们先举个例子吧。 6 00:00:16,364 --> 00:00:18,110 我写的这个程序能告诉你 7 00:00:18,110 --> 00:00:20,346 我在童年里长了多高。 8 00:00:20,506 --> 00:00:22,087 因为每个人的长高速度各不相同, 9 00:00:22,087 --> 00:00:24,458 我就写了这么个函数,名叫calcInches(身高计算)。 10 00:00:24,458 --> 00:00:27,264 我在里面输入 startAge(起始年龄) 和 endAge(终止年龄) 11 00:00:27,264 --> 00:00:29,160 以及 inchesPerYear(年增高值), 12 00:00:29,700 --> 00:00:33,941 然后它就能计算这几年里一共长了多高, 13 00:00:34,874 --> 00:00:36,932 然后把结果返回给调用此函数者。 14 00:00:37,362 --> 00:00:40,093 这里从0岁到8岁, 15 00:00:40,093 --> 00:00:44,354 我调用calinches(计算身高)这个函数, 输入数字 0、8和 2.5, 16 00:00:44,354 --> 00:00:47,717 因为这8年里我平均每年长高2.5英寸。 17 00:00:48,297 --> 00:00:51,904 然后它就运行计算,输出结果 20。 18 00:00:52,171 --> 00:00:57,939 从8岁到16岁这里, 我输入数字8、 16和 2。 19 00:00:57,939 --> 00:01:01,133 因为我没怎么长高,所以输出的结果是16。 20 00:01:01,913 --> 00:01:05,312 这很简单。但现在我想要让它显示 21 00:01:05,312 --> 00:01:08,071 我整个童年里一共长高了多少。 22 00:01:08,771 --> 00:01:10,952 那么我怎么可以做到这步呢? 23 00:01:11,316 --> 00:01:16,894 我可能会先看看自己的代码, 然后想着我这里都用到了哪些值呢。 24 00:01:17,045 --> 00:01:19,922 这里有没有什么看起来像是总身高值的? 25 00:01:20,582 --> 00:01:26,038 在这个 calcInches (身高计算)函数里 确实有个叫 totalInches(总增高值) 的变量, 26 00:01:26,038 --> 00:01:30,560 所以我就把它输出,看看它代表了什么。 27 00:01:30,560 --> 00:01:36,440 在底部输入 text(totalInches, 10, 200) 28 00:01:36,440 --> 00:01:38,455 好了,看看能得到什么结果。 29 00:01:38,455 --> 00:01:40,942 哦,出现报错了! 30 00:01:40,942 --> 00:01:42,939 它说报错原因是 31 00:01:42,939 --> 00:01:45,556 totalInches(总增高值) 未定义。 32 00:01:45,556 --> 00:01:47,624 好吧,奇了怪了, 因为在这里 33 00:01:47,624 --> 00:01:51,622 我们已经定义了totalInches 不是吗? var totalInches = 34 00:01:51,622 --> 00:01:57,143 好吧,问题是因为我们在 一个函数内部声明了totalInches(总增高值), 35 00:01:57,143 --> 00:01:59,114 就是这行这里。 36 00:01:59,114 --> 00:02:01,854 当我们在一个函数内部声明一个变量时, 37 00:02:01,854 --> 00:02:04,314 此变量就会成为局部变量。 38 00:02:05,234 --> 00:02:09,076 它就只在 calcInches(计算身高) 这个函数里才有效。 39 00:02:09,076 --> 00:02:12,945 而在该函数外的所有这些代码 40 00:02:12,945 --> 00:02:15,794 都会无视函数内的局部变量, 41 00:02:15,794 --> 00:02:18,194 它只会看返回值是什么。 42 00:02:18,194 --> 00:02:21,224 它只看返回值 ,不会看变量。 43 00:02:21,224 --> 00:02:24,767 所以当我们在函数外使用 totalInches(总增高值) 时, 44 00:02:24,767 --> 00:02:26,250 程序就不认得它了。 45 00:02:26,250 --> 00:02:28,596 它会说,“ 嘿!我没见过这变量诶! 46 00:02:28,596 --> 00:02:31,072 它是未定义的! 我没法将它算出来!” 47 00:02:32,202 --> 00:02:34,610 所以我们得另寻他路 48 00:02:34,610 --> 00:02:37,198 来让外面的代码认得这变量。 49 00:02:37,398 --> 00:02:42,487 如果我们将它从局部变量转成全局变量, 50 00:02:42,736 --> 00:02:46,879 我们只要把定义从函数里移出就行了, 51 00:02:47,539 --> 00:02:50,042 移到这个所谓的全局作用域里。 52 00:02:51,252 --> 00:02:56,202 现在我们要做的就是在函数里改变赋值, 53 00:02:56,202 --> 00:02:58,342 而无需进行定义或声明。 54 00:02:58,632 --> 00:03:02,484 现在你能看到它显示 Total grown over life: 16(总增高值16)。 55 00:03:02,756 --> 00:03:06,158 所以这就能找到变量了, 因为我们把它转成了全局变量。 56 00:03:06,648 --> 00:03:09,515 但这还不是我们想要的值。 57 00:03:09,625 --> 00:03:11,552 这只是最近一次的增高值而已。 58 00:03:11,552 --> 00:03:13,938 这是因为每次我们调用这个函数时, 59 00:03:13,938 --> 00:03:17,794 totalInches(总增高值) 都只代表当次的总增高值,是吧。 60 00:03:18,714 --> 00:03:21,930 所以我们真正需要的是设置一个新的变量, 61 00:03:21,930 --> 00:03:26,882 用它来把每次算出的值累加起来, 62 00:03:26,882 --> 00:03:28,464 算出整个年龄段的增高值。 63 00:03:29,228 --> 00:03:32,563 所以我们把这行转成局部变量, 64 00:03:33,663 --> 00:03:37,628 我们还要设一个新的全局变量, 名叫 lifeInches(一生总增高值)。 65 00:03:38,168 --> 00:03:40,034 我们让它从0开始, 66 00:03:40,634 --> 00:03:49,471 回到函数里,我们把这个全局变量写成 lifeInches += totalInches. 67 00:03:49,481 --> 00:03:52,893 这样就能把每次调用函数算出的值全部加起来了, 68 00:03:52,954 --> 00:03:56,403 而总和就会等于 lifeInches (一生总增高值)这个变量。 69 00:03:56,403 --> 00:03:58,121 然后到底部 70 00:03:58,121 --> 00:04:00,459 我们敲上 text(lifeInches, 10, 200), 71 00:04:00,459 --> 00:04:02,998 啦啦!一生总增高值出来了! 72 00:04:03,538 --> 00:04:06,431 不过这可不是我现在的身高, 我现在可要比这高! 73 00:04:06,431 --> 00:04:07,595 因为你们也知道 74 00:04:07,595 --> 00:04:10,839 人一出生身高肯定就是大于0的, 75 00:04:10,839 --> 00:04:13,984 所以如果我想算总身高的话, 那开始就该输入20。 76 00:04:14,284 --> 00:04:17,265 结果出来了,这就是我现在的身高。 77 00:04:17,265 --> 00:04:18,539 好吧,我们复习一下: 78 00:04:18,853 --> 00:04:22,157 totalInches(总增高值)是这里的局部变量, 79 00:04:22,157 --> 00:04:25,954 这是因为我们只在函数内部声明它, 80 00:04:25,954 --> 00:04:27,491 它在函数外无效。 81 00:04:28,521 --> 00:04:30,822 也就是说外面的代码 82 00:04:30,822 --> 00:04:34,373 不会认得这个叫 totalInches(总增高值) 的变量。 83 00:04:34,813 --> 00:04:37,656 而 lifeInches(一生总增高值) 就是所谓的全局变量, 84 00:04:37,656 --> 00:04:43,061 这是因为我们是在全局作用域里的 所有函数外面声明它的。 85 00:04:43,586 --> 00:04:45,070 请牢记住这点: 86 00:04:45,070 --> 00:04:47,158 所以当你在写函数和变量时, 87 00:04:47,158 --> 00:04:48,834 想清楚自己要的是 88 00:04:48,834 --> 00:04:51,310 只在函数内部用的局部变量, 89 00:04:51,310 --> 00:04:54,646 还是在整个程序里用的全局变量。 90 00:04:54,646 --> 00:04:57,354 要是你觉得被这两个概念搞得头晕眼花了, 也不用担心, 91 00:04:57,354 --> 00:04:59,927 因为这也是编程里最棘手的概念之一, 92 00:04:59,927 --> 00:05:01,730 在 JavaScript 里更为尤甚。 93 00:05:01,730 --> 00:05:04,734 但这也是熟能生巧的事儿。