1. 什么是函数?
数学中函数定义: x为自变量 经过y计算后有唯一的对应值则y就是x的函数。
编程中函数定义: 一个固定的功能或者程序被封装的过程,实现一个固定的功能或者程序在这个封装体中需要一个入口和出口,入口就是参数,出口就是返回。
2. 了解函数声明
- 函数声明式
- 函数字面量(匿名函数)
// 申明一个test函数
function test() {
// 里面为执行语句
}
// 函数字面量
let test = function () {
// 执行语句
}
函数表达式和函数声明同时使用的的时候, 只有内部才能调用
let test = function test1() {
test1() // 只有在函数内才能调用
}
test1() // 这里无法调用
3. 函数参数操作
函数参数有以下几个特点:
- 函数实参和形参可以不相等
- 函数内部可以知道实参通过arguments对象
- 获取形参的个数,函数名.length
- 形参和实参不是相等的 它们是对应的映射关系
以下为关于参数简单案例
function fn(a, b) {
a = 3;
console.log(argument[0]) // 结果是3
}
fn(1, 3)
function fn(a, b) {
b = 3;
console.log(argument[1]) // 结果是undefind
}
fn(1)
4. 形参和实参的关系整理
先看代码
function test(a = 1, b) {
console.log(a, b)
}
test(undefind, 3) // 1 3
function test(a = undefined, b) {
console.log(a, b)
}
test(1, 3) // 1 3
简单总结: 形参和实参是对应关系,哪个不是undefined就取哪个
5. 递归函数
简单总结以下,其实递归函数总是走到出口的时候再向上一步步赋值计算后返回结果, 找到规律和出口为重点去分析递归函数, 简单案例代码解析以下:
function f(n) {
if(n === 1) {
return 1
}
return n * f(n - 1)
}
// 例如 n = 3
// 3 * f(2)
// 2 * f(1) 此时这个f(1)因为 n=1的话返回为1 f(2) 返回的结果是 2 * 1 所以f(2) = 2 往上推出 f(3) = 6
6. 立即执行函数
之前工作中经常会使用立即执行函数来写模块总结了以下4个特点:
1.只要是括号括起来的都是表达式,只有表达式才能被执行符号执行
(function (a, b) { // 可以
console.log(a + b)
})(1, 2)
let fn = function (a, b) { // 这里也是表达式
console.log(a + b)
}(2, 3)
function fn2(a, b) { // 这里是申明函数不是表达式所以报错
console.log(a + b)
}()
2.证明自执行函数立即执行后会销毁掉
let fn = function () {
console.log(1)
}
console.log(fn) // 会打印函数
let fn = function () {
console.log(1)
}()
console.log(fn) // 会打印1 但是这里打印出来的是undefined
3.自执行函数可以命名但是调用后马上销毁所以没有意义
function fn(a) {
}(6) // 这里不会报错,因为解析为了(6)为一个表达式而不是执行符号
4.如何将一个申明函数变为一个表达式
+ function fn() {retunr 1}() 这里就不会报错 前面可以加很多例如 ! - || 等但是成了表达式函数名就失效了
! function fn() {
console.log(123)
}()
7. callee caller
callee 实参列表中的一个属性指向当前执行的对象 arguments.callee指向当前这个函数
function fn() {
console.log(arguments.callee) // 输出的是fn这个函数
}
// 运用场景闭包中调用匿名函数自己
let a = (function (n) {
if (n <= 1) {
return 1
}
return n + arguments.callee(n - 1)
})(5)
console.log(a) // 15
caller返回一个调用改函数的函数, 被调用函数中,打印被调用函数的caller,可以输出谁在调用它