If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

复习:函数

以下是这个有关函数的教程所包括的内容。
我们编程序时经常想要重新执行一段代码,但不想重新写(或者复制)整段代码。我们需要一个方法可以把一段代码组合在一起并且为这段代码命名,以便以后可以用名字调用这段代码,这就是所谓的 函数
创建一个函数,我们先要为它声明和命名(跟我们创建变量的方法一样),接着写一个函数的定义:
var sayHello = function() {
};
我们可以在那个函数中放任何代码 -- 一个语句、多个语句 -- 就看我们要做什么。在此函数中,我们能在随机的位置输出一段信息:
var sayHello = function() {
   text("你好!", random(200), random(200));
};
现在,如果我们只声明函数,什么也不会发生。要程序执行函数中的代码,我们必须 “调用” 函数:写出它的名字加上空的括号。
sayHello();
接着,我们就能随时调用函数,无论我们想调用多少次都行!
sayHello();
sayHello();
sayHello();
我们经常想要自定义函数,来告诉程序 “那么,执行这些代码,但做一点点改动”。那样我们就有即可重复使用 灵活的代码 ,两全其美。为了达到这个目的,我们可以为函数定义 “参数”,用那些参数改变函数的运作方法,并在调用函数时将它们代入函数。
例如,加入我们希望能够指定信息具体在哪里显示,就像我们能指定 rect() 和 ellipse() 具体在哪里显示?可以设想用以下方式调用,来把信息放在两个精确的坐标定位。
sayHello(50, 100);
sayHello(150, 200);
为了实现以上功能,我们要改变 sayHello 函数的定义,让它知道它将收到 2 个参数,并在函数中运用:
var sayHello = function(xPos, yPos) {
   text("你好!", xPos, yPos);
};
代入的参数在函数定义中基本上就像变量,它们的名字取决于你在括号中把它们叫什么名字。我们可以轻易地把它们重新命名为更短的名字:
var sayHello = function(x, y) {
   text("你好!", x, y);
};
我们的函数可以接受任意数量的参数 -- 零、一、二、或更多。 我们也可以决定把函数改成更有意义的名字并对它说你好:
var sayHello = function(name) {
   text("你好, " + name, random(200), random(200));
};
然后我们将如此调用:
sayHello("Winston");
sayHello("Pamela");
我们可以把这些主意合起来,并让它接受三个参数,包括名字和位置:
var sayHello = function(name, x, y) {
   text("你好" + name, x, y);
};
然后这样调用它:
sayHello("Winston", 10, 100);
这实际上是取决于你想让你的函数做什么,以及你想自定义多少。你总是可以由没有参数开始,然后需要再加。
其实,你整个这段时间都在调用函数 -- 这就是你怎样做出绘图和动画的 -- 例如rectellipsetriangle,等等。那些函数全部都是 ProcessingJS 库里的,我们将它们装在所有你在这儿编写的程序里,这样你就可以一直调用。我们已经为你定义好了这些函数,因为我们觉得会有用,而现在到你决定在自己的程序中要用什么自定义的函数。例如,我们提供 ellipse 函数,但不提供 函数 -- 如果你的程序包括很多不同的猫在不同的位置,也许你该创建自己的猫函数。
对于函数,我们还有一个非常强大的事可以做 -- 我们可以用它们来取一些值,进行计算,返回新的值。想一想你能用计算器做的事情 -- 讲述之相加、减,求平方根、相乘、等。那些功能都是接受输入并输出结果的函数。函数会用输入当作参数并用 返回语句 输出结果。一些是将两个数字相加并返回结果的函数:
var addNumbers = function(num1, num2) {
  var result = num1 + num2;
  return result;
};

var sum = addNumbers(5, 2);
text(sum, 200, 200); // 显示 "7"
返回语句 做的是两件事:它把一个值送回调用函数的人(因此我们可以将它存储在 sum 变量中),并立刻退出函数。也就是说,有以下这样的代码会很不愚蠢,因为那最后一行永远不会被执行:
var addNumbers = function(num1, num2) {
  var result = num1 + num2;
  return result;
  result = result * 2; // 笨笨哒!
};
带返回值的函数对在程序中操作数据很有用,而且可以把它们在公式中合在一起:
var biggerSum = addNumbers(2, 5) + addNumbers(3, 2);
你甚至可以在函数调用中调用函数,可那有时候会很难读:
var hugeSum = addNumbers(addNumbers(5, 2), addNumbers(3, 7));
既然你现在知道怎样创造包含一段代码的函数,我们必须介绍一个重要的概念:局部变量全局变量
在我们在函数 声明新的变量时,我们就说它对那个函数是局部变量。那是因为只有那个函数能使用那个变量 -- 程序中,这个函数外的其他部分不可见。出了函数,就好像这个变量不存在。在以下函数中,localResult 是个局部变量:
var addNumbers = function(num1, num2) {
  var localResult = num1 + num2;
  println("局部结果是:" + localResult);
  return localResult;
};
addNumbers(5, 7);
println(localResult); // 哦不!
当我们运行以上代码的时候,我们将在最后一行得到错误:"localResult is not defined" (localResult 未定义)。此变量只在函数中有定义,因为我们就是在函数中用 var localResult = 声明它的,而它在函数外没有被定义。
当我们在函数外声明变量的时候,我们就说它是全局变量。那是因为现在所有的函数都可以运用并用它做任何想做的事情。
var globalResult;

var addNumbers = function(num1, num2) {
  globalResult = num1 + num2;
  println("全局结果:" + globalResult);
};
addNumbers(5, 7);
println(globalResult);
当我们运行以上的代码时,我们不会看到错误,因为我们在函数外声明了 globalResult ,因此可以在任何地方运用。
⚠️ 你可能很想到处都使用全局变量,这样可以保证永远不会出现未定义的错误。 但实际上,全局变量是难查错误的主要来源。 尤其在更大的程序或共同合作编写的程序中,会很容易忘记你(或其他人!)在哪里和如何使用这些全局变量。 所以,请尽可能地使用本地变量。
每个编程语言都不一样,但对于 JavaScript,很重要的是知道变量有 "函数作用域" - 一个函数可以看到在它里面声明的局部变量以及在它外面声明的全局变量,但它看不见其它函数中的局部变量。

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.