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