Javascript 高级编程 3章64页 【函数】

139 阅读2分钟

函数

function sayHi (name, message) {
    alert("Hello " + name + "," + message);
}
  • function关键字来声明
  • 返回值
    • 定义时,不必指定是否返回值
    • 任何函数在任何时候都可以通过return语句来实现返回值
    • 可以包含多个return语句
    • return后面可以不跟任何值,这时返回undefined值。用于需要提前停止函数执行又不需要返回值的情况下。
    • 函数中return之后的代码不会执行
    • **推荐:要么函数始终返回一个值,要么永远都不返回值。**否则会给调试带来不便。
  • 严格模式下的命名限制
    • 不能把函数或参数,命名为evalarguments
    • 参数不能同名

参数

  • 不介意传递多少个参数
    • 例如,定义接收2个,但实际传了3个,解释器也没问题
  • 不介意传进来的参数是什么数据类型

参数,在内部,是用一个数组来存放和传递的

给参数命名,只是提供便利,但不是必须

  • 函数体内,可以用arguments对象访问这个参数数组
    • arguments对象只是与数组类似,其实并不是Array实例
    • 使用[]来访问它的元素
    • 使用length属性来确定传递进来多少个参数
      • 是由实际传入的参数个数决定
      • 而不是由定义的命名参数个数决定
    • arguments对象可以和命名参数一起使用
      • 可以互换使用
      • function doAdd(num1)arguments[0]和命名参数num1可以互换使用
      • arguments的值永远宇对应的命名参数的值保持同步
  • 没有传递值的命名参数,被自动赋予undefined值
function doAdd (num1, num2) {
    //num2的值和arguments[1]的值,保持同步,也会变为10
    //但二者的内存空间是独立的
    
    //严格模式下,不允许重写arguments的值
    arguments[1] = 10;
    alert(arguments[0] + num2);
    
    //如果实际只传入一个参数,num2不会变为10,即arguments[1]的值不会同步反映到num2中
}
  • 可以让函数接收任意个参数,分别实现功能,像重载那样,如下:
function doAdd() {
    if (arguments.length == 1) {
        alert(arguments[0] + 10);
    } else if (arguments.length == 2) {
        alert(arguments[0] + arguments[1]);
    }
}

//有点儿重载那意思了
doAdd(10);  // 20
doAdd(30, 20);  //50 

没有重载

  • ECMAScript的函数没有签名,真正的重载是不可能做到的
  • 如果定义了两个同名的函数,则该名字只属于后定义的函数
  • 通过检查输入函数中参数的类型和数量,可以模仿重载