函数:复杂数据类型
声明式定义函数
function 函数名(){代码段}
function是定义函数的关键字
function和函数名之间有空格
函数名:就是一个变量,遵循变量的命名规则和规范
():是用来存放参数
{函数体}:是存放要执行的代码段
赋值式定义函数
var 变量名 = function () {代码段}
变量名:自己起的名字
后面的函数称为匿名函数
函数调用
声明式定义函数
语法:函数名()
特点:调用几次就执行几次
赋值式定义函数
语法:变量名()
特点:调用几次就执行几次
两种函数调用区别
声明式调用函数可以先调用也可以后调用
赋值式函数只能先定义后调用
函数的参数
形参和实参
形参:就是在函数定义阶段函数名后面的小括号中的参数
注意:形参只能在函数体内被使用
如果函数调用没有赋值,呢么这个值是undefined,即定义一个变量未赋值
形参就是一个变量,遵循变量名命名规则和规范
实参:在函数调用阶段小括号中书写的参数
形参和实参的数量关系
如果形参和实参一样多:对应进行一一赋值
形参多与实参:前面的一一赋值,没有值的是undefined
形参少于实参:一一进行赋值,多出来的实参保存在函数体内,使用时需要使用变量接受
arguments
是函数体内天生自带的属性
作用:用来接受函数在调用阶段传递的实参,传递了几个,arguments里面就有几个,我们一般叫做伪数组或类数组
arguments的操着
length属性
是arguments的一个属性,用来表示为数组的长度,也就是有几个实参
获取长度语法:arguments.lengtn
返回值:就是一个长度
索引(下标):就是arguments中的数据是按照一定数据排列的,这个顺序叫做索引
索引从0 开始,后面依次加一,最后一项一定是长度-1
作用:就是获取arguments的数据
语法:arguments【索引】
遍历(循环):
就是把我们arguments中的数据都访问一遍
函数的返回值
就是在函数体内,代码运行完毕以后的一个结果,这个结果就叫返回值
如何在函数体内返回结果
return
后面跟我们要返回的内容
注意:return智能写一句话,后续代码不会执行
也就是说,return会阻止后续代码执行
如何在函数体外拿到结果
函数调用就是这个返回值,一般不会这样使用,会用一个变量接受这个结果
函数的封装
就是把经常用的函数封装到函数里面
使用的时候直接使用
函数参数的默认值
当传递参数时使用传递的参数,没有传递参数时使用默认值
预解析
在我们代码执行之前有一个环节叫做预解析
概念:就是对我们的代码进行通读并解释
对哪些进行预解析:
var关键字命名的变量
把var关键字和变量名提到最前面,不赋值
声明式函数
在预解析阶段把函数名提前,提在最前面并赋值为一个函数
如果是赋值式函数按照var预解析规则进行预解析
预解析的重名问题
变量名和变量名重名(只是针对var声明变量)
后面定义的变量名没有意义
函数名和函数名重名
后面定义的覆盖前面的
变量名和函数名重名
函数在各个阶段都做了什么
1,函数定义阶段
定义一个函数,但是不执行代码
就是在堆空间开辟空间,代码以字符串形式保存在里面 ,此时不解析代码,把堆空间地址赋值给变量
2,函数调用阶段
执行函数体代码,首先根据地址找到堆空间,立马开辟一个函数执行空间,在函数执行空间中进行形参赋值,之后再函数执行空间进行预解析,开始执行代码