1. 函数定义
(1)定义:
*由关键字function、函数名、参数和函数体。
(2)定义命名函数:
(3)参数设置
*无参函数:适用于不需要提供任何数据即可完成指定功能的情况。
√Tips:在自定义函数时,即是函数的功能实现不需要设置参数,小括号"()"也不能够省略。
*有参函数:适用于开发时函数体内的操作需要用户传递数据的情况。
形参:函数体内的操作需要用户传递的数据,此时需设置形参
实参:用以接受用户调用的函数时传递,此时需要设置实参
小贴士:含有默认值的参数与剩余参数
*含有默认值的参数:函数的形参在设置时,还可以为其知道你个默认值。当调用者未传递该参数时,函数将使用默认值进行操作。
*剩余参数:在函数定义时,除了可以指定具体数量的形参外,还可以利用"...变量名"的方式动态地接受用户传递的不确定数量的实参。
*若定义transferparam()函数时,所有参数的数量都不确定,则可将上述事例修改成以下形式。
2.函数的调用
(1)直接调用
函数名(实参值);
(2)表达式中调用(适用含有返回值的函数)
(3)在事件中调用
√Tips:
*return语句不是函数必须的,但任何函数在任何时候都可通过return语句+ 返回的值,实现返回;§
*在一个文件中,定义函数名字相同,会使用最后定义的函数。
3.变量的作用域
*不同作用域对应的变量:全局变量、局部变量、块级变量
小贴士:垃圾回收机制
局部变量只有在函数的执行过程中存在,而在这个过程中会为局部变量在(栈或堆)内存上分配相应的空间,以存储它们的值,然后在函数中使用这些变量,直到函数结束。一旦函数执行结束,局部变量就没有存在必要了,此时JavaScript就会通过垃圾回收机制自动释放它们所占用的内存空间。
但是在开发中若要保留局部变量的值,可通过以下两种方式实现:
4.匿名函数
(1)匿名函数
*匿名函数指的是没有函数名称的函数,可以有效的避免全局变量的污染以及函数名的冲突问题。
小贴士:箭头函数
(2)回调函数
*定义:指一个函数A作为参数传递给一个函数B,然后在B的函数体内调用函数A。此时,我们称函数A为回调函数。
*使用回调函数方法
(3)嵌套函数
*定义:在函数内部再定义一个函数,使内部函数轻松获得外部函数的参数以及函数的全局变量。
(4)递归调用
定义:递归调用是函数嵌套调用中一种特殊的调用。它指的是一个函数在其函数体内调用自身的过程,这种函数称为递归函数。
√ Tips:递归调用虽然在遍历维数不固定的多维数组时 非常合适,但它占用的内存和资源比较多,同时难以实现和维护,因此在开发中要慎重使用函数的递归调用。
5.闭包函数
*定义:内嵌函数可以访问定义在外层函数中的所有变量和函数,并包括其外层函数能访问的所有变量和函数,但在函数外部则不能访问函数的内部变量和嵌套函数,此时用“闭包”来实现。
*用途:可以在函数外部读取函数内部的变量,可以让变量的值始终保持在内存中。
√Tips:由于闭包会使得函数中的变量一直被保存在内存中,内存消耗很大,所以闭包的滥用可能会降低程序的处理速度,造成内存消耗等问题。
*实现方式:在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。
递归调用是函数嵌套调用中一种特殊的调用。它指的是一个函数在其函数体内调用自身的过程,这种函数称为递归函数。