WEBVTT 00:00:00.764 --> 00:00:03.070 既然你已经学会了基本的函数, 00:00:03.070 --> 00:00:07.396 那么我现在就要加一点点难度了: 00:00:07.396 --> 00:00:10.984 局部变量与全局变量的差别。 00:00:11.374 --> 00:00:14.179 你现在可能还不明白这两个名词的意思, 00:00:14.179 --> 00:00:16.364 所以我们先举个例子吧。 00:00:16.364 --> 00:00:18.110 我写的这个程序能告诉你 00:00:18.110 --> 00:00:20.346 我在童年里长了多高。 00:00:20.506 --> 00:00:22.087 因为每个人的长高速度各不相同, 00:00:22.087 --> 00:00:24.458 我就写了这么个函数,名叫calcInches(身高计算)。 00:00:24.458 --> 00:00:27.264 我在里面输入 startAge(起始年龄) 和 endAge(终止年龄) 00:00:27.264 --> 00:00:29.160 以及 inchesPerYear(年增高值), 00:00:29.700 --> 00:00:33.941 然后它就能计算这几年里一共长了多高, 00:00:34.874 --> 00:00:36.932 然后把结果返回给调用此函数者。 00:00:37.362 --> 00:00:40.093 这里从0岁到8岁, 00:00:40.093 --> 00:00:44.354 我调用calinches(计算身高)这个函数, 输入数字 0、8和 2.5, 00:00:44.354 --> 00:00:47.717 因为这8年里我平均每年长高2.5英寸。 00:00:48.297 --> 00:00:51.904 然后它就运行计算,输出结果 20。 00:00:52.171 --> 00:00:57.939 从8岁到16岁这里, 我输入数字8、 16和 2。 00:00:57.939 --> 00:01:01.133 因为我没怎么长高,所以输出的结果是16。 00:01:01.913 --> 00:01:05.312 这很简单。但现在我想要让它显示 00:01:05.312 --> 00:01:08.071 我整个童年里一共长高了多少。 00:01:08.771 --> 00:01:10.952 那么我怎么可以做到这步呢? 00:01:11.316 --> 00:01:16.894 我可能会先看看自己的代码, 然后想着我这里都用到了哪些值呢。 00:01:17.045 --> 00:01:19.922 这里有没有什么看起来像是总身高值的? 00:01:20.582 --> 00:01:26.038 在这个 calcInches (身高计算)函数里 确实有个叫 totalInches(总增高值) 的变量, 00:01:26.038 --> 00:01:30.560 所以我就把它输出,看看它代表了什么。 00:01:30.560 --> 00:01:36.440 在底部输入 text(totalInches, 10, 200) 00:01:36.440 --> 00:01:38.455 好了,看看能得到什么结果。 00:01:38.455 --> 00:01:40.942 哦,出现报错了! 00:01:40.942 --> 00:01:42.939 它说报错原因是 00:01:42.939 --> 00:01:45.556 totalInches(总增高值) 未定义。 00:01:45.556 --> 00:01:47.624 好吧,奇了怪了, 因为在这里 00:01:47.624 --> 00:01:51.622 我们已经定义了totalInches 不是吗? var totalInches = 00:01:51.622 --> 00:01:57.143 好吧,问题是因为我们在 一个函数内部声明了totalInches(总增高值), 00:01:57.143 --> 00:01:59.114 就是这行这里。 00:01:59.114 --> 00:02:01.854 当我们在一个函数内部声明一个变量时, 00:02:01.854 --> 00:02:04.314 此变量就会成为局部变量。 00:02:05.234 --> 00:02:09.076 它就只在 calcInches(计算身高) 这个函数里才有效。 00:02:09.076 --> 00:02:12.945 而在该函数外的所有这些代码 00:02:12.945 --> 00:02:15.794 都会无视函数内的局部变量, 00:02:15.794 --> 00:02:18.194 它只会看返回值是什么。 00:02:18.194 --> 00:02:21.224 它只看返回值 ,不会看变量。 00:02:21.224 --> 00:02:24.767 所以当我们在函数外使用 totalInches(总增高值) 时, 00:02:24.767 --> 00:02:26.250 程序就不认得它了。 00:02:26.250 --> 00:02:28.596 它会说,“ 嘿!我没见过这变量诶! 00:02:28.596 --> 00:02:31.072 它是未定义的! 我没法将它算出来!” 00:02:32.202 --> 00:02:34.610 所以我们得另寻他路 00:02:34.610 --> 00:02:37.198 来让外面的代码认得这变量。 00:02:37.398 --> 00:02:42.487 如果我们将它从局部变量转成全局变量, 00:02:42.736 --> 00:02:46.879 我们只要把定义从函数里移出就行了, 00:02:47.539 --> 00:02:50.042 移到这个所谓的全局作用域里。 00:02:51.252 --> 00:02:56.202 现在我们要做的就是在函数里改变赋值, 00:02:56.202 --> 00:02:58.342 而无需进行定义或声明。 00:02:58.632 --> 00:03:02.484 现在你能看到它显示 Total grown over life: 16(总增高值16)。 00:03:02.756 --> 00:03:06.158 所以这就能找到变量了, 因为我们把它转成了全局变量。 00:03:06.648 --> 00:03:09.515 但这还不是我们想要的值。 00:03:09.625 --> 00:03:11.552 这只是最近一次的增高值而已。 00:03:11.552 --> 00:03:13.938 这是因为每次我们调用这个函数时, 00:03:13.938 --> 00:03:17.794 totalInches(总增高值) 都只代表当次的总增高值,是吧。 00:03:18.714 --> 00:03:21.930 所以我们真正需要的是设置一个新的变量, 00:03:21.930 --> 00:03:26.882 用它来把每次算出的值累加起来, 00:03:26.882 --> 00:03:28.464 算出整个年龄段的增高值。 00:03:29.228 --> 00:03:32.563 所以我们把这行转成局部变量, 00:03:33.663 --> 00:03:37.628 我们还要设一个新的全局变量, 名叫 lifeInches(一生总增高值)。 00:03:38.168 --> 00:03:40.034 我们让它从0开始, 00:03:40.634 --> 00:03:49.471 回到函数里,我们把这个全局变量写成 lifeInches += totalInches. 00:03:49.481 --> 00:03:52.893 这样就能把每次调用函数算出的值全部加起来了, 00:03:52.954 --> 00:03:56.403 而总和就会等于 lifeInches (一生总增高值)这个变量。 00:03:56.403 --> 00:03:58.121 然后到底部 00:03:58.121 --> 00:04:00.459 我们敲上 text(lifeInches, 10, 200), 00:04:00.459 --> 00:04:02.998 啦啦!一生总增高值出来了! 00:04:03.538 --> 00:04:06.431 不过这可不是我现在的身高, 我现在可要比这高! 00:04:06.431 --> 00:04:07.595 因为你们也知道 00:04:07.595 --> 00:04:10.839 人一出生身高肯定就是大于0的, 00:04:10.839 --> 00:04:13.984 所以如果我想算总身高的话, 那开始就该输入20。 00:04:14.284 --> 00:04:17.265 结果出来了,这就是我现在的身高。 00:04:17.265 --> 00:04:18.539 好吧,我们复习一下: 00:04:18.853 --> 00:04:22.157 totalInches(总增高值)是这里的局部变量, 00:04:22.157 --> 00:04:25.954 这是因为我们只在函数内部声明它, 00:04:25.954 --> 00:04:27.491 它在函数外无效。 00:04:28.521 --> 00:04:30.822 也就是说外面的代码 00:04:30.822 --> 00:04:34.373 不会认得这个叫 totalInches(总增高值) 的变量。 00:04:34.813 --> 00:04:37.656 而 lifeInches(一生总增高值) 就是所谓的全局变量, 00:04:37.656 --> 00:04:43.061 这是因为我们是在全局作用域里的 所有函数外面声明它的。 00:04:43.586 --> 00:04:45.070 请牢记住这点: 00:04:45.070 --> 00:04:47.158 所以当你在写函数和变量时, 00:04:47.158 --> 00:04:48.834 想清楚自己要的是 00:04:48.834 --> 00:04:51.310 只在函数内部用的局部变量, 00:04:51.310 --> 00:04:54.646 还是在整个程序里用的全局变量。 00:04:54.646 --> 00:04:57.354 要是你觉得被这两个概念搞得头晕眼花了, 也不用担心, 00:04:57.354 --> 00:04:59.927 因为这也是编程里最棘手的概念之一, 00:04:59.927 --> 00:05:01.730 在 JavaScript 里更为尤甚。 00:05:01.730 --> 00:05:04.734 但这也是熟能生巧的事儿。