函数
命名函数
匿名函数
构造函数
纯函数
预解析
关键字var和function开头的语句块提前进行处理
- 处理过程:当变量和函数的声明处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头。
解释代码和执行代码
- 因为是在所有代码执行之前进行解释,所以叫做 预解析(预解释)
- 需要解释的内容有两个
- var 关键字
- 在内存中先声明有一个变量名
- 会把 var 关键字声明的变量进行提前说明, 但是不进行赋值
- 声明式函数
- 在内存中先声明有一个变量名是函数名,并且这个名字代表的内容是一个函数
- 也就是会把函数名进行提前声明, 并且赋值为一个函数
- var 关键字
- 注意点
- 赋值式函数 var fn=function(){} 按照var的规则进行解析
- 在预解析阶段如果变量名和函数名重名了,最终的解析结果是函数为准,也就是函数的优先级高于变量名
- 在if语句中,不管条件是否成立,里面的代码都会进行预解析
- return后面的代码虽然不执行,但是会进行预解析
- 结论:
通过预解析,我们知道函数名不要和变量名重名
声明式函数可以先调用,尽量不要先调用/尽量使用赋值式函数来定义
预解析重名情况
多个预解析存在情况
按照这个顺序预解析
1、 匿名函数的名称变量
2、 实参变量
3、函数内 function定义的命名函数
4、var 定义并且赋值的变量
预解析特殊情况
参数
arguments参数列表
arguments可以调用函数
ES6严格模式下面两个方法将会被禁用,调用时报错
arguments.callee 指向当前函数 当函数是匿名函数时,如果需要再次调用可以使用这个方法
函数.caller 指向的是当前函数被执行的上下文环境函数
抛出异常
捕获异常
即使出现错误也可以继续执行