局部变量与全局变量 (视频版)
-
0:01 - 0:03既然你已经学会了基本的函数,
-
0:03 - 0:07那么我现在就要加一点点难度了:
-
0:07 - 0:11局部变量与全局变量的差别。
-
0:11 - 0:14你现在可能还不明白这两个名词的意思,
-
0:14 - 0:16所以我们先举个例子吧。
-
0:16 - 0:18我写的这个程序能告诉你
-
0:18 - 0:20我在童年里长了多高。
-
0:21 - 0:22因为每个人的长高速度各不相同,
-
0:22 - 0:24我就写了这么个函数,名叫calcInches(身高计算)。
-
0:24 - 0:27我在里面输入
startAge(起始年龄) 和 endAge(终止年龄) -
0:27 - 0:29以及 inchesPerYear(年增高值),
-
0:30 - 0:34然后它就能计算这几年里一共长了多高,
-
0:35 - 0:37然后把结果返回给调用此函数者。
-
0:37 - 0:40这里从0岁到8岁,
-
0:40 - 0:44我调用calinches(计算身高)这个函数,
输入数字 0、8和 2.5, -
0:44 - 0:48因为这8年里我平均每年长高2.5英寸。
-
0:48 - 0:52然后它就运行计算,输出结果 20。
-
0:52 - 0:58从8岁到16岁这里, 我输入数字8、 16和 2。
-
0:58 - 1:01因为我没怎么长高,所以输出的结果是16。
-
1:02 - 1:05这很简单。但现在我想要让它显示
-
1:05 - 1:08我整个童年里一共长高了多少。
-
1:09 - 1:11那么我怎么可以做到这步呢?
-
1:11 - 1:17我可能会先看看自己的代码,
然后想着我这里都用到了哪些值呢。 -
1:17 - 1:20这里有没有什么看起来像是总身高值的?
-
1:21 - 1:26在这个 calcInches (身高计算)函数里
确实有个叫 totalInches(总增高值) 的变量, -
1:26 - 1:31所以我就把它输出,看看它代表了什么。
-
1:31 - 1:36在底部输入 text(totalInches, 10, 200)
-
1:36 - 1:38好了,看看能得到什么结果。
-
1:38 - 1:41哦,出现报错了!
-
1:41 - 1:43它说报错原因是
-
1:43 - 1:46totalInches(总增高值) 未定义。
-
1:46 - 1:48好吧,奇了怪了, 因为在这里
-
1:48 - 1:52我们已经定义了totalInches 不是吗?
var totalInches = -
1:52 - 1:57好吧,问题是因为我们在
一个函数内部声明了totalInches(总增高值), -
1:57 - 1:59就是这行这里。
-
1:59 - 2:02当我们在一个函数内部声明一个变量时,
-
2:02 - 2:04此变量就会成为局部变量。
-
2:05 - 2:09它就只在 calcInches(计算身高)
这个函数里才有效。 -
2:09 - 2:13而在该函数外的所有这些代码
-
2:13 - 2:16都会无视函数内的局部变量,
-
2:16 - 2:18它只会看返回值是什么。
-
2:18 - 2:21它只看返回值 ,不会看变量。
-
2:21 - 2:25所以当我们在函数外使用
totalInches(总增高值) 时, -
2:25 - 2:26程序就不认得它了。
-
2:26 - 2:29它会说,“ 嘿!我没见过这变量诶!
-
2:29 - 2:31它是未定义的! 我没法将它算出来!”
-
2:32 - 2:35所以我们得另寻他路
-
2:35 - 2:37来让外面的代码认得这变量。
-
2:37 - 2:42如果我们将它从局部变量转成全局变量,
-
2:43 - 2:47我们只要把定义从函数里移出就行了,
-
2:48 - 2:50移到这个所谓的全局作用域里。
-
2:51 - 2:56现在我们要做的就是在函数里改变赋值,
-
2:56 - 2:58而无需进行定义或声明。
-
2:59 - 3:02现在你能看到它显示
Total grown over life: 16(总增高值16)。 -
3:03 - 3:06所以这就能找到变量了,
因为我们把它转成了全局变量。 -
3:07 - 3:10但这还不是我们想要的值。
-
3:10 - 3:12这只是最近一次的增高值而已。
-
3:12 - 3:14这是因为每次我们调用这个函数时,
-
3:14 - 3:18totalInches(总增高值)
都只代表当次的总增高值,是吧。 -
3:19 - 3:22所以我们真正需要的是设置一个新的变量,
-
3:22 - 3:27用它来把每次算出的值累加起来,
-
3:27 - 3:28算出整个年龄段的增高值。
-
3:29 - 3:33所以我们把这行转成局部变量,
-
3:34 - 3:38我们还要设一个新的全局变量,
名叫 lifeInches(一生总增高值)。 -
3:38 - 3:40我们让它从0开始,
-
3:41 - 3:49回到函数里,我们把这个全局变量写成
lifeInches += totalInches. -
3:49 - 3:53这样就能把每次调用函数算出的值全部加起来了,
-
3:53 - 3:56而总和就会等于 lifeInches
(一生总增高值)这个变量。 -
3:56 - 3:58然后到底部
-
3:58 - 4:00我们敲上 text(lifeInches, 10, 200),
-
4:00 - 4:03啦啦!一生总增高值出来了!
-
4:04 - 4:06不过这可不是我现在的身高, 我现在可要比这高!
-
4:06 - 4:08因为你们也知道
-
4:08 - 4:11人一出生身高肯定就是大于0的,
-
4:11 - 4:14所以如果我想算总身高的话, 那开始就该输入20。
-
4:14 - 4:17结果出来了,这就是我现在的身高。
-
4:17 - 4:19好吧,我们复习一下:
-
4:19 - 4:22totalInches(总增高值)是这里的局部变量,
-
4:22 - 4:26这是因为我们只在函数内部声明它,
-
4:26 - 4:27它在函数外无效。
-
4:29 - 4:31也就是说外面的代码
-
4:31 - 4:34不会认得这个叫 totalInches(总增高值) 的变量。
-
4:35 - 4:38而 lifeInches(一生总增高值)
就是所谓的全局变量, -
4:38 - 4:43这是因为我们是在全局作用域里的
所有函数外面声明它的。 -
4:44 - 4:45请牢记住这点:
-
4:45 - 4:47所以当你在写函数和变量时,
-
4:47 - 4:49想清楚自己要的是
-
4:49 - 4:51只在函数内部用的局部变量,
-
4:51 - 4:55还是在整个程序里用的全局变量。
-
4:55 - 4:57要是你觉得被这两个概念搞得头晕眼花了,
也不用担心, -
4:57 - 5:00因为这也是编程里最棘手的概念之一,
-
5:00 - 5:02在 JavaScript 里更为尤甚。
-
5:02 - 5:05但这也是熟能生巧的事儿。
![]() |
Zhuofu Li edited Chinese, Simplified subtitles for Local and Global Variables (Video Version) | |
![]() |
Zhuofu Li edited Chinese, Simplified subtitles for Local and Global Variables (Video Version) | |
![]() |
Zhuofu Li edited Chinese, Simplified subtitles for Local and Global Variables (Video Version) | |
![]() |
Zhuofu Li edited Chinese, Simplified subtitles for Local and Global Variables (Video Version) | |
![]() |
Simon Lin edited Chinese, Simplified subtitles for Local and Global Variables (Video Version) |