JavaScript基础之函数基础

函数


函数的定义

函数是指由 事件驱动 或 当它被调用时 执行的可重复使用 的代码块。


函数定义的方式有两种:

函数由关键字function定义,第一种定义方式:函数声明形式

function abs (x) {
    if (x > 0) {
    return x;
 } else {
    return;
 }
}

其中,abs为函数名,x为参数,多个参数用逗号","隔开, 花括号里的是函数体,函数体可以是语句块,也可以是空语句。

函数体在执行时,一旦执行到return时,函数执行结束并返回结果,且return后面的代码不执行;如果没有return,函数也会返回结果,但此时返回的值是undefined

由于javascript函数也是一个对象,abs()就是一个函数对象,我们可以将abs()视为指向此函数的一个变量。


因此第二种函数的定义方式为:函数表达式形式


var abs =function (x) {
  if (x >0) {
  return x;
 }  else {
  return;
 }
};

这种情况下,function (x) {......}是一个匿名函数,它没有函数名,但它赋值给了变量abs,因此可以通过变量abs调用该函数。

注:当匿名函数赋值给一个变量,后面的要加";",不能省略。



当调用abs()函数时,若没有参数,即:

abs(); //返回NaN

此时,参数为undefined,返回的结果为NaN。


想要避免收到undefined,可以对参数进行检查即:

function abs (x) {
  if (typeof x !== undefined) {
    throw"Not a number"
 } if (x >0) {
    return x;
 } else {
    return;
 }
}


argument


JavaScript函数自带一个关键字argument,它指向当前函数的调用者传入的所有参数,类似一个数值Array,但又不是一个Array。使用argument可以访问传入函数的所有参数,arguments[0]表示访问传入函数的第一个参数,arguments.length得到传入参数的个数。


JavaScript可以接收任意多个参数。

如:

function abs (x) {
  if (typeof x !== undefined) {
    throw"Not a number"
 } if (x >0) {
    return x;
 } else {
    return;
 }
}

调用:

abs(10, 1, 20, 0); //返回10 1 20 0

argument[0]得到的结果是10,argument[1]得到的结果是1,argument[3]得到的结果是0。使用argument.length得到参数的个数为4。



rest

当我们调用函数时,实参的个数大于形参的个数时,想要获取全部的实参,不得不使用argument书写复杂的代码来实现。

function foo (a, b) {
    var i, rest = []; //定义一个空数组,用来装多余的参数。
    if (arguments.length > 2) {
        for (i = 2; i<arguments.length; i++) {
            rest.push(arguments[i]);
        }
    }
    console.log('a = ' + a);
    console.log('b = ' + b);
    console.log(rest);
}

由于定义函数时, 规定的形参个数为2,所以想要得到多余的实参,应规定当传入的实参的个数大于2时,使用argument.length获得传入的实参数量,rest.push(argument[i])获得多余的参数,这样书写很复杂,ES6标准引入了rest关键字,用来获取传入的全部参数。


上面的实例可以书写为:

function foo (a, b, ...rest) {
  console.log(rest);
}

这样可以输出全部的参数。


rest使用格式:rest必须写在参数的最后面且rest前面必须用"..."标识,如:function  abs (a, b, ...rest){}



小心return语句


我们知道javascript引擎有个自动在行末尾添加分号的机制,这样很可能会掉进return的陷阱。如:

function abs (x) {
  return {name : "x"};
}


 

但如果不小心这样书写了:

function abs(x) {
    return
           {name : "x"};
}


由于javascript的机制,上述代码其实写成了:


function abs (x) {
    return;  //自动在行末尾添加分号,想当于 return undefined。
       {name : "x"};//此时这个段代码不会执行。
}


由于return后面会自动添加";",执行到return时,函数执行结束,后面的代码{name : "x"}不会执行,相当于返回了undefined值。所以正确的多行书写格式为:


function abs (x) {
    return {
    name : "x"
  };
} 


没有传递值的形参将自动赋值undefined,就跟定义了变量没有初始化相似。


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

abs(1); //返回NaN

以上将1传递给了参数num1,而没有传递值给num2,所以将自动赋值undefined给num2,因此返回结果是"1 + undefined"的值,即:NaN。


重载

重载函数、方法的名称相同,但参数的类型和数量(函数签名)不同的形式称重载。


JavaScript不像其它语言一样有重载,因为JavaScript的参数是包含零个或多个值的数组。

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

funcion abs (num1, num2) {
    return num1 * num2;
}

abs(1,2);

以上定义了两个相同的函数,则该名字属于后定义的函数,后定义的函数会覆盖先定义的函数,所以调用了abs()函数后的结果返回2。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值