JavaScript:函数

在JavaScript中,函数使用function关键字来声明,后跟一组参数以及函数体。函数被认为是代码重用的最小单位,基本语法如下所示:

function funcName(arg0,arg1,...,argN) {
    // do something
}

函数通过函数名来调用,后面跟上一对圆括号和参数,例如:

function speak(name) {
    alert("Hello " + name);
}
speak("张三");

函数输出结果为“Hello 张三”。函数定义中的命名参数name被用作了字符串拼接的操作数。

JavaScript中的函数在定义时不必指定是否返回值。例如:

function sum(n1, n2) {
    return n1 + n2;
}

sum()函数的作用是返回两个数的和,除了return外,没有任何声明表示要返回一个值。调用代码如下:

var result = sum(1, 2);

执行完return语句之后停止并立即退出函数。因此,return之后的任何语句不会执行。

function sum(n1, n2) {
    return n1 + n2;
    alert("Hello JavaScript");      // 不会执行
}

return语句也可以不带任何返回值。这种情况下,函数返回undefined值。

function doSomething() {
    return;
    alert("running");   // 永远不会执行
}

严格模式对函数的限制:

  • 不能把函数命名为eval或arguments;
  • 不能把参数命名为eval或arguments;
  • 不能出现两个命名参数同名的情况

参数

  JavaScript函数的参数与其他语言的参数有所不同。JavaScript函数忽略传递进来的参数个数和数据类型。这就是说,即使定义的函数只接收两个参数,在调用这个参数是也未必一定要传递两个参数。原因是JavaScript中的参数在内部是用一个数组来表示。函数接收的是这个数组,而不关心数组中包含哪些参数。在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

  arguments对象只是与数组类似,并不是Array的实例。可以使用方括号的形式访问它的每一个参数(例如:第一个参数是arguments[0],第二个参数是arguments[1]),使用length属性确定传递输入的参数个数。

// function speak(name, age)
function speak() {
    alert("I'm " + arguments[0] + ",and I'm " + arguments[1]);
}

  函数中不包含命名参数。虽然没有name和age标识符,但函数的功能不变。这说明了JavaScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。

  另外,在JavaScript中,解析器不会验证命名参数。通过访问arguments对象的length属性可以获知有多少个参数,然后再调用的时候传入参数的个数:

function howManyArgs() {
    alert(arguments.length);
}
howManyArgs("张三", 19);  // 2
howManyArgs(19);        // 1
howManyArgs();          // 0

利用这个特点,可以让函数接收任意多个参数并实现相应的功能。例如:

function doSum() {
    if (arguments.length == 1) {
        alert(arguments[0] + 1);
    } else if (arguments.length == 2) {
        alert(arguments[0] + arguments[1]);
    }
}
doSum(1);   // 2
doSum(2, 3);// 5

另一方面,arguments可以和命名参数一起使用。

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

由于num1的值与arguments[0]的值相同,因此它们可以互换使用(当然,num2和arguments[1]也是如此)。

值得注意的是:arguments的值永远与对应命名参数的值保持一致。

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

每次执行该函数都会重写第二个参数的值为10。因为arguments对象中的值会自动反映到对应的命名参数,所以修改arguments[1],也就修改了num2,结果它们的都会变成10。这两个值不会访问相同的内存空间,它们的内存空间是独立的,但是它们的值是同步的。另外,如果只传入一个参数,那么为arguments[1]设置的值不会反应到命名参数中。arguments对象的长度由传入的参数个数决定,不是由定义参数的命名参数的个数决定的。

最后一点,没有传递值的参数将自动被赋予undefined值。例如,只给doSum()函数传递了一个参数,则num2中就会保存undefined值。

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

重载

JavaScript中的函数没有签名,因此不能实现如Java那样的重载。

function doAddNum(num) {
    return num + 1;
}

function doAddNum(num) {
    return num + 2;
}

var result = doAddSum(0);   // 2

以上例子中,函数doAddSum()被定义了两次。由于后定义的函数会覆盖先定义的函数,因此调用doAddSum()函数时,调用的是后一个doAddSum()函数,所以返回的是2。

你可能感兴趣的:(JavaScript:函数)