1. 函数定义阶段
1. 在 堆内存 中开辟一段储存空间
2. 把函数体内的代码当做 字符串 放在开辟出来的存储空间内
3. 把函数名放在 栈内存 中,把堆内存中的空间地址赋值给 栈内存的变量
2. 函数调用阶段
1. 按照 栈内存 中变量存储的地址找到函数的存储空间
- 如果这个空间不是一个函数存储空间,那么直接报错 xxx is not a function
2. 在 调用栈 中开辟一段新的 函数执行空间
- 把函数存储空间内的形参、代码全部复制过来
3. 在这个执行空间内,进行形参的赋值
- 赋值是在函数调用空间内执行的
4. 在这个执行空间内,进行函数内代码的预解析
- 对函数体内存储的一段 字符串 进行通读并解释
5. 把函数体内的 字符串 当做 js 代码来执行
- 如果是合法的 js 代码,那么直接执行
- 如果不合法,此时才会报错
6. 代码执行完毕后,此次开辟的函数执行空间销毁
3. 总结
- 在函数的调用过程中先 形参 赋值然后预解析
- 不要在函数内定义和形参一样的函数名,这样形参就变的无意义了
- 函数名和变量名不要重名
- 不管是函数还是变量,进行先声明后使用