首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

2.8 函数

如果需要多次使用同一组语句,还可以把它们打包为一个函数。所谓函数(function)就是一组允许人们在代码里随时调用的语句。从效果上看,每个函数都相当于一个短小的脚本。

作为一种良好的编程习惯,你们应该先对函数做出定义再调用它们。

下面是一个简单的示例函数:

这个函数里的循环语句将依次弹出几个alert对话框来显示Beatles乐队成员的名字。现在,如果你想在自己的脚本里执行这一动作,可以随时使用如下所示的记号来调用这个函数:

每当需要反复执行一段代码时,我们都可以利用函数来避免重复输入大量的相同内容。不过,函数的真正威力体现在,我们可以把不同的数据传递给它们,而它们将使用实际传递给它们的数据去完成预定的操作。在把数据传递给函数时,我们把那些数据称为参数(argument)。

下面是用来定义一个函数的语法:

JavaScript提供了许多可以拿来就用的内建函数,在前面的内容里多次出现过的alert()就是一个内建函数:这个函数需要我们提供一个参数,它将弹出一个对话框来显示这个参数的值。

在定义函数时,你可以为它声明任意多个参数,只要记得用逗号把它们分隔开来就行。在函数的内部,你可以像使用普通变量那样使用它的任何一个参数。

下面是一个需要传递两个参数的函数。如果我们把两个数值传递给这个函数,这个函数将对它们进行乘法运算:

在定义了这个函数的脚本里,我们可以从任意位置去调用这个函数,如下所示:

把数值10和2传递给multiply()函数的结果如下所示。

这将产生这样一种视觉效果:屏幕上会立刻弹出一个显示乘法运算结果(20)的alert对话框。如果这个函数能把乘法运算结果返回给调用这个函数的语句往往会更有用。这很容易做到:函数不仅能够(以参数的形式)接收数据,还能够返回数据。

我们完全可以创建一个函数并让它返回一个数值、一个字符串、一个数组或一个布尔值。这需要用到return语句:

下面这个函数只有一个参数(一个华氏温度值),它将返回一个数值(同一温度的摄氏温度值):

函数的真正价值体现在,我们还可以把它们当作一种数据类型来使用,而这意味着我们可以把一个函数的调用结果赋值给一个变量:

把华氏温度值95转换为摄氏温度值的结果如下所示。

在这个例子里,变量temp_celsius的值将是35,这个数值由convertToCelsius函数返回。

你们或许想知道我是如何命名变量和函数的。在命名变量时,我用下划线来分隔各个单词;在命名函数时,我从第二个单词开始把每个单词的第一个字母写成大写形式(也就是所谓的Camel记号)。我这么做是为了让自己能够一眼看出哪些名字是变量、哪些名字是函数。与变量的情况一样,JavaScript语言也不允许函数的名字里包含空格。Camel记号可以在不违反这一规定的前提下,把变量和函数的名字以一种既简单又明确的方式区分开来。

变量的作用域

前面讲过,作为一种良好的编程习惯,在第一次对某个变量进行赋值时应该用var对其做出声明。当在函数内部使用变量时,就更应该这么做。

变量既可以是全局的,也可以是局部的。在谈论全局变量和局部变量之间的区别时,我们其实是在讨论变量的作用域(scope)。

全局变量(global variable)可以在脚本中的任何位置被引用。一旦你在某个脚本里声明了一个全局变量,你就可以从这个脚本中的任何位置——包括各有关函数的内部——引用它。全局变量的作用域是整个脚本。

局部变量(local variable)只存在于对它做出声明的那个函数的内部,在那个函数的外部是无法引用它的。局部变量的作用域仅限于某个特定的函数。

因此,我们在函数里既可以使用全局变量,也可以使用这个函数的局部变量。这一细节很有用,但它有时也会导致一些问题。如果在一个函数的内部不小心使用了某个全局变量的名字,即使本意是想使用一个局部变量,JavaScript也会认为是在引用那个全局变量。

还好,我们可以用var关键字明确地为在函数中使用的变量设定一个作用域。

如果在某个函数中使用了var,那个变量就将被视为一个局部变量,它将只存在于这个函数的上下文中;反之,如果没有使用var,那个变量就将被视为一个全局变量,如果你的脚本里已经存在一个与之同名的变量,这个函数将覆盖那个现有变量的值。

我们来看下面这个例子:

这些代码将不可避免地导致全局变量total的值发生变化。

全局变量total的值变成了400。我的本意是让square()函数只把它计算出来的平方值返回给变量number,但因为未在这个函数里用var关键字把它内部的total变量明确地声明为局部变量,这个函数把名字同样是total的那个全局变量的值也改变了。

把这个函数写成如下所示的样子才是正确的:

现在,全局变量total变得安全了,再怎么调用square()函数也不会影响到它。

请记住,函数在行为方面应该像一个自我包容的脚本,而这意味着在定义一个函数时,我们必须把它内部的变量全都明确地声明为局部变量。如果从没忘记在函数里使用var关键字,就可以避免任何形式的二义性隐患。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论