1.函数的定义方式
我们都知道,在JavaScript中有两种定义函数的方式,分别为声明式函数和赋值式函数,但是两种函数在执行顺序却有不同。
比如:
声明式
<script>
fn(); // 1
function fu(){
console.log(1)
}
</script>
赋值式
<script>
fn(); // fn is not a function
var fn = function(){
console.log(1)
}
</script>
在声明式的函数中,函数在未定义之间执行没有任何问题,会在控制台中打印1
,但是赋值式的就会报错,会告诉你fn
不是一个函数,这是为什么呢?这就要从JavaScript的解析顺序说起。
2.JavaScript解析顺序
JavaScript解析顺序分为预编译期与执行期。
也就是说JavaScript在执行代码之前会先进行预编译,在预编译期JavaScript会对本代码块中所有声明的变量和函数进行预处理,需要注意的是这里面只会将变量进行声明,但不进行初始化赋值,而且这里面处理的函数是声明式的函数。
举个例子:
<script>
fn();
var a =3;
function fn(){
console.log(1)
};
b();
var b = f