函数:复杂数据类型

声明式定义函数

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,函数调用阶段

                执行函数体代码,首先根据地址找到堆空间,立马开辟一个函数执行空间,在函数执行空间中进行形参赋值,之后再函数执行空间进行预解析,开始执行代码