0:00:01.383,0:00:03.649 现在我们谈谈你这期间 0:00:03.649,0:00:05.685 一直在用的 函数 0:00:05.685,0:00:09.140 当你使用 rect() fill() text() 这些命令时 0:00:09.140,0:00:12.376 你其实是在调用函数 这些函数就会实现 0:00:12.376,0:00:15.132 你所叫它们做的事情 0:00:15.132,0:00:16.806 函数究竟是什么 0:00:16.806,0:00:19.483 我们把一堆代码凑到一起 0:00:19.483,0:00:21.240 并给它取个名字 好让我们能 0:00:21.240,0:00:23.168 多次使用它的功能 0:00:23.368,0:00:25.981 比如rect() 它是用来干什么的 0:00:25.981,0:00:28.551 它就是用来画四条线的 是吧 0:00:28.551,0:00:31.141 而我们也可以只用line()这个函数 是吧 0:00:31.141,0:00:33.847 这样我们就得到了一个长方形样的东西 0:00:33.847,0:00:36.751 但当我们想要 0:00:36.751,0:00:39.322 画很多个长方形的时候 0:00:39.322,0:00:40.773 那么每次都进行这些计算 0:00:40.773,0:00:42.784 就相当地烦人了 还要费劲地思考 0:00:42.784,0:00:44.282 这个角的这条线要怎么画 0:00:44.282,0:00:45.818 那个角的要怎么画... 0:00:45.818,0:00:48.538 所以不如用个rect()函数 0:00:48.538,0:00:50.858 这个函数的效果跟之前 0:00:50.858,0:00:55.148 那四行代码的效果一样 却又更加简洁 0:00:55.148,0:00:58.399 这样还挺棒的 rect()这个函数 0:00:58.399,0:01:00.519 在可汗学院的所有的程序中 0:01:00.519,0:01:02.729 都是能直接用的 0:01:02.729,0:01:05.339 当然你也可以自己写个函数 0:01:05.339,0:01:08.409 然后在自己的程序里调用 0:01:08.409,0:01:11.430 举个栗子 假设我们要写个程序 0:01:11.430,0:01:14.434 我们想画很多次的温斯顿(黄脸娃娃) 0:01:14.434,0:01:17.017 因为我们可能会讲讲温斯顿的人生历程 0:01:17.017,0:01:20.190 并把每个年龄段的它都展示出来 0:01:20.190,0:01:24.243 所以我们开始写画出温斯顿的代码了 0:01:24.243,0:01:27.106 我们这里用 faceX 和 faceY 两个变量 0:01:27.106,0:01:29.029 来规定脸部的中心位置 0:01:29.029,0:01:31.243 之后画眼睛和鼻子的时候 0:01:31.243,0:01:33.039 就能参照这两个变量了 0:01:33.039,0:01:34.732 现在程序认得这些代码了 0:01:34.732,0:01:37.325 但它还不是函数 所以程序运行了一下 0:01:37.325,0:01:39.739 然后也只能就运行一次 0:01:39.739,0:01:43.717 所以我们就来把它转成函数吧 0:01:43.717,0:01:46.439 转化的步骤很像 0:01:46.439,0:01:48.487 声明变量那样 因为实际上 0:01:48.487,0:01:50.245 就是一样的 0:01:50.245,0:01:52.077 我们敲上 var drawWinston 0:01:52.077,0:01:54.551 这个名字不错 生动又形象 0:01:54.551,0:01:59.037 再敲上 = 号 然后接的就不是数字或字符串了 0:01:59.037,0:02:02.721 我们要接的是 function 不要拼写错了 0:02:02.721,0:02:08.357 然后是小括号 () 再后是前大括号 { 0:02:08.357,0:02:11.563 接着后大括号 } 最后是分号 ; 0:02:11.563,0:02:14.490 所以我们接下来就是要把所有 0:02:14.490,0:02:19.454 函数要用的功能都放进大括号里 0:02:19.454,0:02:22.130 所以我们要把底下的所有代码 0:02:22.130,0:02:26.816 都放进我们的函数里 缩进下更好看 啦啦 0:02:26.816,0:02:28.970 所以我们现在就把这些变量 0:02:28.970,0:02:32.379 整理成函数了 基本上我们是 0:02:32.379,0:02:35.759 把这块代码贴上了个标签 然后我们就能 0:02:35.759,0:02:37.859 随时告诉自己的程序: 0:02:37.859,0:02:40.765 嘿 找出带那标签的那段代码 运行它! 0:02:40.765,0:02:43.551 我们把这段代码转成可重复使用的了 0:02:43.551,0:02:46.535 但是别忘了 温斯顿不见了 0:02:46.535,0:02:49.357 我们弄丢了温斯顿 他人跑去哪儿了呢 0:02:49.357,0:02:53.025 好吧 其实是我们把代码放进函数里之后 0:02:53.025,0:02:55.907 相当于是告诉程序 嘿 这里的这些代码 0:02:55.907,0:02:57.842 是我想稍后还能用的 0:02:57.842,0:03:00.807 但只有我叫你用时 你才能用 0:03:00.807,0:03:04.288 所以我们就得叫程序运行这段代码 0:03:04.288,0:03:09.110 这就要“调用”函数 就跟使用ellipse() rect() line()一样 0:03:09.400,0:03:13.753 所以我们只要敲上函数名 drawWinston 0:03:13.753,0:03:16.376 后面接上小括号() 0:03:16.376,0:03:18.959 还有记得加上分号 啦啦 0:03:18.959,0:03:20.942 温斯顿出来了 0:03:20.942,0:03:24.237 好了 我觉得棒极了 但你可能无语了 0:03:24.237,0:03:27.373 因为我们相当于是把之前程序所做的 0:03:27.373,0:03:30.239 又做了一遍 有点傻是吧 0:03:30.239,0:03:32.920 不过函数的关键就是它能重复使用 0:03:32.920,0:03:34.957 所以我们现在要开工了 0:03:34.957,0:03:41.162 我们只需不断复制黏贴这个函数就可以了 0:03:41.162,0:03:46.572 额... 看起来没变嘛 但其实是有的 0:03:46.572,0:03:48.998 它画了多个温斯顿 可问题在于 0:03:48.998,0:03:51.474 它们完全重叠在一起了 0:03:51.474,0:03:54.428 如果有X光的话 我们就可以扫一下那图象 0:03:54.428,0:03:57.631 然后就能看到三个温斯顿了 但我可没X光眼 0:03:57.631,0:04:00.334 也许你有吧 0:04:00.334,0:04:03.440 但我们可以对函数做些小修改 0:04:03.440,0:04:05.486 然后就能看到了 0:04:05.486,0:04:08.825 你看 faceX 和 faceY 总是202和208没有 0:04:08.825,0:04:11.587 我们能用 random() 函数来做点改变 0:04:11.587,0:04:14.849 比如 random() 范围设成50到350 它就会 0:04:14.849,0:04:19.183 在范围里随机挑选一个数字 下面也是一样 0:04:19.183,0:04:23.023 这样每次调用这个函数时 它都会随机生成新数 0:04:23.023,0:04:26.566 如果我们点下刷新 温斯顿就会随机再现 0:04:26.566,0:04:29.359 棒呆了 哇 0:04:29.359,0:04:32.095 好了 我觉得这棒极了 因为本来这是要 0:04:32.095,0:04:34.916 写很多代码才能实现的 而有函数就省事多了 0:04:34.916,0:04:38.317 本来是要当前代码量的三倍的 0:04:38.317,0:04:40.960 不过这还不够实用 0:04:40.960,0:04:43.796 因为我们也许不想要随机的温斯顿 0:04:43.796,0:04:45.736 我们可能想要的是固定的温斯顿 0:04:45.736,0:04:47.846 想让它固定在屏幕的某个特定位置 0:04:47.846,0:04:49.943 那么敬请期待 因为下次我们就会讲 0:04:49.943,0:04:52.483 如何给这个函数传递参数 从而得到 0:04:52.000,0:04:56.000 位置固定的温斯顿