淘先锋技术网

首页 1 2 3 4 5 6 7
  • ECMAScript中的函数在定义的时候不用指定是否返回值。函数体内用return返回值,并立即退出函数体,return后面的语句永远不会执行。
function sum(num1, num2){
    return num1 + num2;
    alert('HELLO WORLD'); //永远不会执行
}
  • ECMAScript函数的命名参数(即java中所说的形参)可以少于、等于或者多于调用函数时传进来的参数(即java中的实参),甚至可以没有命名参数,调用的时候也一样可以传进来参数。
//命名参数多于传进去的参数,多出来的命名参数会被赋予‘undefined’
function sum(num1, num2, num3) {
    console.log(num1, num2, num3);
}

sum(10);//10 undefined undefined
  • 命名参数少于传进来的参数甚至没有命名参数,那怎么获取到传进来的参数呢?实际上,在函数体内可以通过arguments对象访问到传递给函数的参数数组。
//命名参数少于传进去的参数,用arguments对象获取传进来的参数
function sum(num1) {
    console.log(num1, arguments[0], arguments[1], arguments[2], arguments, arguments.length);
}

sum(10, 20, 30);//10 10 20 30 [10, 20, 30] 3
  • arguments的值永远与对应命名参数的值保持一致,arguments对象中的值会自动反应到对应的命名参数。他们的值会同步,但是他们的内存空间是独立的。
//改变arguments对象中的值,对应的命名参数也会改变
function sum(num1, num2) {
    console.log('第一次输出:', num1, num2)
    arguments[1] = 30;
    console.log('第二次输出:', num1, num2);
}

sum(10, 20);//'第一次输出:', 10, 20
            //'第一次输出:', 10, 30

 

  • arguments对象的长度是由传入的参数个数决定的。所以上面的例子,若:
//改变arguments对象中的值,对应的命名参数也会改变
function sum(num1, num2) {
    console.log('第一次输出:', num1, num2)
    arguments[1] = 30;
    console.log('第二次输出:', num1, num2, typeof(num2), typeof(num2)==='undefined');
}

sum(10);//'第一次输出:', 10 undefined
        //'第一次输出:', 10 undefined 'undefined' true
//命名参数多于传进去的参数
function sum(num1, num2, num3) {
    console.log(num1, num2, num3, arguments.length);
}

sum(10);//10 undefined undefined 1
  • 利用arguments对象模仿方法的重载。在java中可以为一个函数编写两个定义,使其接受的参数类型和数量不同来实现重载,即定义了两个不同的签名,而ECMAScript函数没有签名,所以做不到真正的重载。在ECMAScript函数中可以通过检查传入函数中参数(或者arguments对象中)的类型和数量,模仿方法的重载。
function sum(num1, num2) {
    if(typeof(num1) === 'string' && typeof(num2) === 'string'){
        console.log(num1 + num2);
    }else if(typeof(num1) === 'number' && typeof(num2) === 'number'){
        console.log(num1 - num2);
    }
}
sum('10', '20');//'1020'
sum(10, 20);//-10

 

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