写在前面:
函数相信对于大家并不陌生,其本质就是一个封装功能块,给这个函数定义一些规则(功能代码),当你调用它
时,它就会给你返回相应的结果,有的需要传参而有的则不用;函数也分内置函数与自定义函数。
一、函数入门
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对象赋值一份
特点:
- 由于
arguments是属于函数的内部属性,所以仅能在函数中调用,函数外则不可以调用。 arguments并不是数组,他只是一个对象(object)arguments与形参是一一对应的关系,当两者之间的任何一方改变,都会改变各自的值arguments适用场景是有多个形参需要赋值时,简化工作量
在JS中,作用域分三类:全局作用域,局部作用域,块级作用域(let{})
7. 函数返回多个值
函数只能返回一个值。如果我们希望运行一个函数后,得到多个数据,可以在函数的内部定义一个数组(或者是一个对象),然后,在函数的内部,把你要返回的多个值,都保存在数组元素(或者是对象的属性)当中。最后,把这个数组(对象)返回。
二、ES6中对函数的扩展
1. 参数的默认值
在ES6之前不能直接为函数的参数指定默认值,只能在函数内部设定默认值,现则可以直接写在参数定义的后面
function f(形参名1=默认值1,形参名2=默认值2){
//函数体
}
特点:
- 当没有对形参赋值时,函数默认使用默认值
- 传值时,实参会按顺序向形参赋值,如果实参个数大于形参,则忽略后面的实参,如果形参的个数大于实参,则后面的形参值为
Undefined
2. rest参数
ES6 引入 rest 参数。它是在定义函数时使用。“你们不要了的都给我。”
格式:
function f(a, ...rest){ //函数的定义
//在调用函数时,把第一个参数传给a,其它的所有的参数传给rest
}
注意:
- 函数f中有两个变量a与rest
- rest是一个数组
- rest只是一个变量名,可改变
- rest必须是最后一个形参
- 可替代arguments对象
调用函数时,...拓展运算符,用来把一个数组“打散”
3. 箭头函数
基本的作用 :简化函数的定义,让我们写函数时更加的方便,快捷。
格式:
var f = (形参列表) =>{
//函数体
}
特点:
- 只有一个形参时,()可省略
- 只有一句代码时,{}可省略,return语句则还可以省略return
- 不可以使用arguments对象,该对象在函数体内不存在,如果要用实参列表,可以用 rest 参数代替
- 箭头函数根本没有自己的this,他调用的只是外部windows的this