1. 什么是函数?
2. 函数的好处
3. 函数的创建方式
- 函数定义必须使用 function
- 函数的命名规则与变量一致
(1) 普通函数: function 函数名称() {}
(2) 匿名函数: var 函数名称 = function() {}
(3) 构造函数: var 函数名称 = new Function('param1', 'param2', ..., "代码体");
// (1) 普通函数
function add1(n, m){
return n + m;
}
console.log(add1(1,2 )); // 3
// (2) 匿名函数
var add2 = function(n, m){
return n + m;
}
console.log(add2(1,2 )); // 3
// (3) 构造函数
var add3 = new Function('n', 'm', "var res = n + m; return res");
console.log(add3(1,2 )); // 3
<!-- (4)DOM 事件驱动函数 -->
<body>
<button id="btn">点击</button>
<script>
function fn() {
alert('hi');
}
// 1.获取到按钮,给按钮绑定点击事件
var btn = document.getElementById('btn');
// 2.点击的时候,fn会自动补全一个小括号,称为事件驱动函数
btn.onclick = fn;
</script>
</body>
5. 形参
- 形式的参数,就是一个占位
- 是一个局部变量
- 不确定因素做形参
- 默认是undefined, 调用时才能明确类型与具体值
6. 实参
7. return关键字
- 终止函数, 并返回结果
- 若没有return, 则返回undefined
8. arguments
- 只能在函数内部出现
- 用于动态接收实参
- 是一个伪数组
- 通过下标取值 -> arguments[index]
- arguments.length 输出当前函数存储的参数个数
function add() {
var res = 0;
for (var i = 0; i < arguments.length; i++) {
res += arguments[i];
}
return res;
}
console.log(add(10, 20, 30, 40, 50)); // 150
9. 作用域
- 函数作用的范围
(1) 全局作用域 -> 函数外部的
(2)局部作用域 -> 函数内部的
10. 作用域链
- 在函数内部寻找某个变量的值, 首先会在当前函数内查找, 如果找不到就一层一层向外层函数寻找, 这个过程就是作用域链
11.递归
- 递归就是函数自己调用自己, 要有临界点(结束条件)
- 循环能做的事, 递归都能做, 但是递归的性能比循环要弱
- 递归就是代码复用
12. 递归的使用方法
- 首先找临界值(无需计算, 就能获得的值)
- 找这一次和上一次的关系
- 假设当前函数已经可以使用, 调用自身计算上一次
13. 递归的使用场景
- 快速排序
- 对象的深拷贝
- 多级菜单
- node.js对文件的遍历
14.递归拓展 - 面试题
- 假如大家去面试, 如果被问到递归相关知识, 说明面试官对你要求挺高(递归考的是内存管理机制), 但是公司明文禁止使用递归
-
禁止使用递归的原因: 假如传递过来的值是不确定的, 一旦发生故障, 会瞬间开辟很多个内存空间, 可能会导致蓝屏或者死机等风险.
// eg. 使用递归求 1~100 的和
// 临界点: num == 1
// sum(100) = sum(99) + 100 -> sum(n) = sum(n - 1) + n
function add(num){
if(num == 1){
return 1;
}
return add(num - 1) + num;
}
console.log(add(100)); // 5050