浅析 Js 之“函数”篇

230 阅读4分钟

写在前面:

函数相信对于大家并不陌生,其本质就是一个封装功能块,给这个函数定义一些规则(功能代码),当你调用它
时,它就会给你返回相应的结果,有的需要传参而有的则不用;函数也分内置函数与自定义函数。

一、函数入门

1. 函数创建的两种方式:

(1). 函数声明:function f(){}

(2). 函数表达式:var f = function f(){}

注意:函数声明方式定义的函数会被提升,而函数表达式方式声明的函数不会被提升!

2. 函数的命名方法

(1)小驼峰命名法:toString()

(2)大驼峰命名法:ToString()

(3)下划线命名法:to_string()

3. 参数类型

(1) 实际参数: 函数调用时,()中写的参数,叫实参,作用是给函数传递真实的数据,传递过去形参接收了

(2) 形式参数:函数定义时,()中写的参数,叫形参,相当于函数内部的局部变量,作用是用来接收实参

函数值的返回是通过`return`语句来执行,`return`之后的语句将不再执行,其也称作跳转语句,默认返回`Undefined`

4. 函数参数的传递

(1)基本数据类型(值传递):把基本数据类型的实参传递给形参,就相当于把值赋给形参,但形参与实参的数据是相互独立的,改变形参并不会影响实参

(2)引用数据类型(地址传递):当引用数据类型传值时,传的是数据对应的地址,形参可以修改实参的数据

例子:

<script>
    var a =[1];
    function f(a){
        a[100]=3;
        a=[1,2,3];
    }
    f(a);
    console.log(a) //[1, empty × 99, 3]
</script>

5. 函数可作另一个函数的参数

一个函数可以作为另一个函数的参数,这个函数可以是函数声明,也可以是函数表达式

6. arguments对象

arguments对象是所有(非箭头)函数中都可用的局部变量。其实就是实参向形参赋值的同时,也会向argument对象赋值一份

特点

  1. 由于arguments是属于函数的内部属性,所以仅能在函数中调用,函数外则不可以调用。
  2. arguments并不是数组,他只是一个对象(object
  3. arguments与形参是一一对应的关系,当两者之间的任何一方改变,都会改变各自的值
  4. arguments适用场景是有多个形参需要赋值时,简化工作量

在JS中,作用域分三类:全局作用域,局部作用域,块级作用域(let{})

7. 函数返回多个值

函数只能返回一个值。如果我们希望运行一个函数后,得到多个数据,可以在函数的内部定义一个数组(或者是一个对象),然后,在函数的内部,把你要返回的多个值,都保存在数组元素(或者是对象的属性)当中。最后,把这个数组(对象)返回。

二、ES6中对函数的扩展

1. 参数的默认值

在ES6之前不能直接为函数的参数指定默认值,只能在函数内部设定默认值,现则可以直接写在参数定义的后面

function f(形参名1=默认值1,形参名2=默认值2){
    //函数体
}

特点:

  1. 当没有对形参赋值时,函数默认使用默认值
  2. 传值时,实参会按顺序向形参赋值,如果实参个数大于形参,则忽略后面的实参,如果形参的个数大于实参,则后面的形参值为Undefined

2. rest参数

ES6 引入 rest 参数。它是在定义函数时使用。“你们不要了的都给我。”

格式:

function f(a, ...rest){ //函数的定义
//在调用函数时,把第一个参数传给a,其它的所有的参数传给rest
}

注意:

  • 函数f中有两个变量a与rest
  • rest是一个数组
  • rest只是一个变量名,可改变
  • rest必须是最后一个形参
  • 可替代arguments对象

调用函数时,...拓展运算符,用来把一个数组“打散”

3. 箭头函数

基本的作用 :简化函数的定义,让我们写函数时更加的方便,快捷。

格式:

var f = (形参列表) =>{
    //函数体
}

特点:

  1. 只有一个形参时,()可省略
  2. 只有一句代码时,{}可省略,return语句则还可以省略return
  3. 不可以使用arguments对象,该对象在函数体内不存在,如果要用实参列表,可以用 rest 参数代替
  4. 箭头函数根本没有自己的this,他调用的只是外部windows的this

结语:学疏才浅,仅供学习与交流