Return to Video

局部变量与全局变量 (视频版)

  • 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:46
    totalInches(总增高值) 未定义。
  • 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:18
    totalInches(总增高值)
    都只代表当次的总增高值,是吧。
  • 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:22
    totalInches(总增高值)是这里的局部变量,
  • 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
    但这也是熟能生巧的事儿。
Title:
局部变量与全局变量 (视频版)
Description:

more » « less
Video Language:
English
Duration:
05:06

Chinese, Simplified subtitles

Revisions