博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ECMAScript 5 —— 函数
阅读量:6073 次
发布时间:2019-06-20

本文共 3032 字,大约阅读时间需要 10 分钟。

函数对任何语言来说都是一个核心的概念。通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。

 

一.定义使用

ECMAScript 中的函数使用 function 关键字来声明,后跟一组参数以及函数体。函数的基本语法如下所示:

function functionName(arg0, arg1,...,argN) {    statements }

以下是一个函数示例:

function sayHi(name, message) {    alert("Hello " + name + "," + message);}

这个函数可以通过其函数名来调用,后面加上一对圆括号和参数(圆括号中的参数如果有多个,可以用逗号隔开)。调用 sayHi()函数的代码如下所示:

sayHi("Nicholas", "how are you today?");

ECMAScript 中的函数在定义时不必指定是否返回值,任何函数在任何时候都可以通过return 语句来实现返回值。看下面的例子:

function sum(num1, num2) {    return num1 + num2;}

这个sum()函数的作用是把两个值加起来返回一个结果。除了 return 语句之外,没有任何声明表示该函数会返回一个值。调用这个函数的示例代码如下:

var result = sum(5, 10);

 另外,return 语句也可以不带有任何返回值。在这种情况下,函数在停止执行后将返回 undefined值。这种用法一般用在需要提前停止函数执行而又不需要返回值的情况下。

 

二.函数参数

ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数。之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数。在函数体内可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。

其实,arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访问它的每一个元素(即第一个元素是 arguments[0],第二个元素是 argumetns[1],以此类推),使用 length 属性来确定传递进来多少个参数。在前面的例子中,sayHi()函数的第一个参数的名字叫name,而该参数的值也可以通过访问 arguments[0]来获取。因此,那个函数也可以像下面这样重写,即不显式地使用命名参数:

function sayHi() {    alert("Hello " + arguments[0] + "," + arguments[1]);}

这个重写后的函数中不包含命名的参数。虽然没有使用 name 和 message 标识符,但函数的功能依旧。这个事实说明了 ECMAScript 函数的一个重要特点:命名的参数只提供便利,但不是必需的。另外,在命名参数方面,其他语言可能需要事先创建一个函数签名,而将来的调用必须与该签名一致。但在 ECMAScript 中,没有这些条条框框,解析器不会验证命名参数。 而没有函数签名,真正的重载是不可能做到的。

通过访问 arguments 对象的 length 属性可以获知有多少个参数传递给了函数。下面这个函数会在每次被调用时,输出传入其中的参数个数:

function howManyArgs() {        alert(arguments.length);}howManyArgs("string", 45);     //2howManyArgs();                  //0howManyArgs(12);              //1

由此可见,开发人员可以利用这一点让函数能够接收任意个参数并分别实现适当的功能。看下面的例子:

function doAdd() {    if(arguments.length == 1) {         alert(arguments[0] + 10);     } else if (arguments.length == 2) {        alert(arguments[0] + arguments[1]);    }}doAdd(10);                //10doAdd(30, 20);            //50

函数 doAdd()会在只有一个参数的情况下给该参数加上 10;如果是两个参数,则将那个参数简单相加并返回结果。因此,doAdd(10)会返回 20,而 doAdd(30,20)则返回 50。虽然这个特性算不上完美的重载,但也足够弥补 ECMAScript 的这一缺憾了。

另一个与参数相关的重要方面,就是 arguments 对象可以与命名参数一起使用,如下面的例子所示:

function doAdd(num1, num2) {    if (arguments.length == 1) {        alert(num1 + 10);    } else if (arguments.length == 2) {        alert(arguments[0] + num2);    }}

在重写后的这个 doAdd()函数中,两个命名参数都与 arguments 对象一起使用。由于 num1 的值与 arguments[0]的值相同,因此它们可以互换使用(当然,num2 和 arguments[1]也是如此)。

关于 arguments 的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步。例如:

function doAdd(num1, num2) {    arguments[1] = 10;    alert(arguments[0] + num2);}

每次执行这个 doAdd()函数都会重写第二个参数,将第二个参数的值修改为 10。因为 arguments对象中的值会自动反映到对应的命名参数,所以修改 arguments[1],也就修改了 num2,结果它们的值都会变成 10。不过,这并不是说读取这两个值会访问相同的内存空间;它们的内存空间是独立的,但它们的值会同步。另外还要记住,如果只传入了一个参数,那么为 arguments[1]设置的值不会反应到命名参数中。这是因为 arguments 对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。 没有传递值的命名参数将自动被赋予 undefined 值。这就跟定义了变量但又没有初始化一样。例如,如果只给 doAdd()函数传递了一个参数,则 num2 中就会保存undefined 值。

最后,ECMAScript 中的所有参数传递的都是值,不可能通过引用传递参数。

 

 

好了,本篇文章就介绍到这儿,欢迎大家留言交流;喜欢或有帮助到您的话,点个赞或推荐支持一下!

 

转载于:https://www.cnblogs.com/johnvwan/p/9541336.html

你可能感兴趣的文章
quicksort
查看>>
检验函数运行时间
查看>>
【BZOJ2019】nim
查看>>
Oracle临时表空间满了的解决办法
查看>>
四部曲
查看>>
LINUX内核调试过程
查看>>
【HDOJ】3553 Just a String
查看>>
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>
ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
查看>>
lintcode:next permutation下一个排列
查看>>
python 递归
查看>>
一个想法(续二):换个角度思考如何解决IT企业招聘难的问题!
查看>>
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
对象合成复用之策略模式
查看>>
linux命令之tail
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>