1. 什么是函数?
把特定功能的代码抽取为一个独立实体。
2. 函数的好处
- 代码的
复用(通过函数名调用) 简短而清晰,提高可读性方便维护和理解
3. 函数的分类
3.1 内置函数(系统函数)
Number()、parseInt()、Math.random()......
3.2 自定义函数
函数的语法:
//1.定义函数
function 函数名称(形参){
//逻辑代码
//返回值return
}
//2.调用函数,并且接收结果
var res = 函数名称(实参);
【注】具体规则
-
函数必须用
关键字function来定义 -
函数名称命名规则(和变量名命名规则一致):
- ① 只能由数字、字母、下划线_、$组成;
- ② 不能用数字开头;
- ③ 不能是关键字保留字;
- ④ 严格区分大小写;
- ⑤ 驼峰命名法;
- ⑥ 语义化。
-
形参(可写可不写):
- ① 只是用来
占位,默认值undefined; - ②
局部变量 - ③ 只有在调用的时候,才能确定它的类型
- ④ 形参个数,不影响函数本身
- ① 只是用来
-
关键字 return(可写可不写):
- 不写return关键字,函数
默认返回undefined - return关键字用于
返回结果,并且中断函数的执行
- 不写return关键字,函数
-
实参(可写可不写):实实在在的具体值
4. 函数的3种写法
函数严格来说:先定义,后使用。
4.1 普通函数。调用可以写在前面或者后面.(普通函数会预编译,提升到前面)
fnA();
function fnA(){
return "我是普通函数";
}
4.2 匿名函数。调用只能写在后面
var fnB = function(){
return "我是匿名函数";
}
fnB();
4.3 构造函数/创建函数。 js提供的内置的类 ---> Function
var fn = new Function("形参1","形参2","形参3"......,"函数体")
var fnC = new Function("a","b","return a + b")
fnC(1,2);
//等价于
function fnC(a,b){
return a + b;
}
fnC(1,2);
5. arguments对象:
- 作用:用于
动态接收实参 - 只能用于
函数内部 - 伪数组,实际上是一个
对象 arguments.length来获取参数的个数arguments[i]的方式来访问数组中的第i个参数(i为下标,从0开始)
6. 作用域:
- 定义:变量的作用范围
(作用域补充链接zhuanlan.zhihu.com/p/438848875 )
- 分类:
- ① 全局变量:函数外部的变量是全局变量
- ② 局部变量:函数内部的变量是局部变量
- 不用var关键字声明变量,
直接用 "=" 赋值是全局变量;(不推荐这么做,数据容易被污染) - 当全局变量和局部变量同时存在,
局部变量优先; - var声明的变量都会产生
变量提升,发生预编译。
7. 作用域链:
定义:函数内部访问某个变量时,优先访问函数内部的局部变量,如果没有则一级一级往上找,直到全局变量,否则报错。
window是浏览器的宿主对象(顶级对象)。
8. 函数的嵌套:
- 兄弟函数之间可以相互访问
- 不能访问兄弟函数里面嵌套的局部函数
9. 事件驱动:
- 获取元素
var oBtn = document.getElementById("btn") ;//获取文档里的元素
- 绑定事件(用事件来驱动函数)
oBtn.onclick = fn ;//事件.onclick就像是给fn加了(),实现了调用函数。
10. 函数的递归调用
-
什么是递归?
- ①函数
自己调用自己; - ②要有
结束条件(临界值)
- ①函数
-
递归的使用场景:
- ①循环能做的,递归都能实现(但递归性能不好,会不断压进栈和出栈)
- ②多级菜单
- ③后台管理系统建权
- ④手写深度拷贝
- ⑤快速排序