函数对于任何语言来说都是一个核心的概念。通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。函数的基本语法如下所示:
function functionName(arg0, arg1, ..., argN) {
statements
}
作为一种良好的习惯,应该对函数先定义再调用。另外要么让函数始终都返回一个值,要么永远都不要返回值。否则,如果函数有时候返回值,有时候有不返回值,会给调试代码带来不便。
函数的参数
与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 255 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。
在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。例如arguments[0]
代表第一个参数。这个事实说明了ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。
通过访问arguments对象的length属性可以获取有多少参数传递给了函数。
function howManyArgs() {
alert(arguments.length);
}
howManyArgs("string", 45);
howManyArgs();
howManyArgs(12);
另外注意:arguments对象的值会自动反应到对应的命名参数,他们两个的内存空间是独立的,只是他们的值会同步,但是如果修改命名参数是不会改变arguments中对应的值的。
function fun(x) {
arguments[0] = 1;
alert(x);
}
fun();
fun(6);
说明: 1、fun()在调用时没有传参数,那么fun(x)中的参数x就是undefined,而arguments对象也是一个空对象,由于没有传参数,JavaScript也没有为x分配内存,所以alert(typeof(x))也是undefined,那么函数体里为arguments[0]=1赋值和x没有任何关系,那么alert(x)当然是undefined了。
2、fun(6)在调用时传参数,那么JavaScript就会为函数fun(x)中的参数x分配一个内存并赋值6,由于对象是基于引用的赋值的,所以arguments对象的第一个元素[0]也指向了x所对应的内存地址,而现在在函数体里为arguments[0]=1,由于它们是指向同一个地址,相当于也改变了x的值,那么alert(x)当然是1了。
function test(str) {
var str = "world";
return "Hello, " + arguments[0];
}
test("javascript")
这个和上面唯一的区别就是:给函数传了一个叫str的参数,并且只有这一个参数,那么str与arguments[0]都是对这个参数值的引用,所以就相当于这样:
function test(str) {
arguments[0] = "world";
return "Hello, " + arguments[0];
}
test("javascript")
如果换成这样……
function test(str) {
arguments[0] = "world";
var str = "wangdaodao";
return "Hello, " + arguments[0];
}
test("javascript")
避免这样的问题,就是换一个变量名吧!
如果觉得此篇文章对您有帮助,希望可以请我喝雪碧!