此时,你可能已经意识到 每次你想制作一个动画程序的时候, 都会用到一个特别的函数, 那就是“draw”(画画)函数。 提醒一下大家, 这是我们的汽车动画程序。 记住我们已经输入了"var x=11" (给x赋值11)语句, ——这是汽车的起始位置, 然后限定 “var draw” 函数, 然后写下所有画汽车的代码, 然后我们改变X的值,X每次增加3, 那汽车就可以启动了! 哇!轰隆轰隆轰隆! 现在你已经学会如何制作自己的函数了, 你可能会开始想, “这个‘draw’(画画)函数是什么东西?” “这是一个自定义函数吗? 为什么总是把它命名为‘draw’? ” 嗯,这些都是很好的问题。 你看,在我们可汗学院的运行环境中, 有几个非常特别的全局函数, 我把它们称为“魔法函数”, 但那只是我自己给它们起的名字。 基本上,当我们运行你写的程序的时候, 我们会先看你有没有用一些特定的名字 定义函数,例如“draw”(画画), 如果你有用这些名字的话, 我们会在特定的时候调用它们。 例如,当你在代码里定义了“draw”(画画)函数, 那我们就会找到这个函数, 我们会分析该函数内的代码, 然后我们反复调用该函数, 调用得越快越好。 如果你不定义一个“draw(画画)函数”的话, 那我们就什么都不会调用, 因为那里什么都没有。 这也就意味着如果我们把这个函数 重命名为“drow”的话, ——好吧,它运行不了。 或者重命名为“drawCar”, ——好吧,也运行不了。 所以如果我们重命名这个函数, 程序就再也找不到它了。 因为它就再也不叫“draw”(画画)了。 最终它再也不能被反复调用, 最终我们什么结果都得不到。 所以,这就意味着你不应该把 你的自定义函数命名为“draw”(画画), 除非你想要它被区别对待, 或者反复调用它。 “draw”(画画)函数并不是唯一的魔法函数。 还有许多其他函数,在用户使用鼠标 或者敲击键盘的时候,它们可以作出反应。 让我们来展示另外一个动画程序的例子。 假如说,我们希望当用户移动鼠标的时候, 一个彩球能出现。 我们输入“draw”(画画), 然后输入“fill”(填充)”和“ellipse”(椭圆), 再输入(mouseX, mouseY, 10, 10) 好了,我们来试一下。 哇!好酷! 这个这么酷的彩球就能不断出现了。 这样子,这个函数, 这个“draw”(画画)函数里的代码 就能被反复调用了, 因为我们把它放在一个叫 “draw”(画画)的函数里。 所以,即使用户没有移动鼠标,也能调用它们。 现在我没有移动鼠标,但是它还是能被调用。 其实,还有一种更好的、效率更高的方法。 我们可以做的事就是把“draw”(画画)函数 改成“mouseMoved”(鼠标移动)函数。 我们的运行环境会不断检查, 看它们有没有定义一个叫 “mouseMoved”(鼠标移动)的函数。 如果有的话,那只要用户移动鼠标, 它们就会调用该函数。 再看看,现在它还能运行。 但是,如果用户没有移动鼠标的话, 该函数就不会被调用。 只要我不再移动我的鼠标, 它就不会被调用。 还记得我们之前用“draw”(画画)函数的时候吗? 即使我们没有移动鼠标, 代码也一直在被调用。 但是现在我们用了“mouseMoved”这个函数, 那就只有当我们需要,即鼠标实际移动的时候, 才会调用该代码。 这样,我们的程序就变得高效多了。 总体而言,如果你希望只有当用户移动鼠标时, 程序才输出结果, 那么最好把代码放在“mouseMoved”函数里面, 而不是“draw”函数里面。 还有很多像“mouseMoved”(鼠标移动) 这样的魔法函数,如: “mousePressed”(按击鼠标);“mouseReleased” (松开鼠标);“keyPressed”(敲击键盘)等, 你可以在文件记录中看到所有这些函数。 最关键的是要记住, 如果你想要使用魔法函数, 一定要正确拼写它们。 如果你不用魔法函数的话, 确保你会给你的自定义函数起一个新的名字。