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 = function(){
console.log(1)
}
</script>
JavaScript在处理上面的代码时,先预编译,简单理解,就是将所有变量声明和声明式函数先读一遍,也就是说在代码执行之前,JavaScript已经知道这段代码中有两个变量a
,b
和一个函数体fn
可以这样理解Javascript先建立一个仓库把他们存起来。
<script>
// 预编译阶段
var a,
var b,
function fn(){
console.log(1)
};
</script>
接下来就是执行阶段,执行阶段就没什么好说的了,就是代码一行一行执行
<script>
// 预编译阶段
var a,
var b,
function fn(){
console.log(1)
};
//执行阶段
fn(); //结果打印: 1
a =3; //将a进行初始化复制
b(); // 发现仓库里有b,但此时b为初始化赋值前,是undefined,不是一个函数,
这里就会报错, b is not a function
b = function(){ // 给b赋值一个函数,但是因为上一行代码出错,这里将停止执行
console.log(1)
}
</script>
如果有其他疑问或是看法可以在评论里或投稿跟小编进行讨论,
也可以关注微信公众号【筑梦前端】进行投稿,与小编一起探讨更多的编程知识。