JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程:
1、把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
2、把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
3、先提升function,在提升var
JavaScript的执行过程
![](https://img.haomeiwen.com/i4993096/7726b8c6a65564c5.png)
如果变量和函数同名的话,函数优先
![](https://img.haomeiwen.com/i4993096/b22f78d519988867.png)
变量提升
1、变量提升:定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升。
2、函数提升:JavaScript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面
我们来看几个例子吧
![](https://img.haomeiwen.com/i4993096/c09cf288c1028d9b.png)
![](https://img.haomeiwen.com/i4993096/4856de5813eda2bb.png)
在if中
![](https://img.haomeiwen.com/i4993096/612a439c09618f59.png)
函数提升
声明一个函数可以可以写成几种形式
![](https://img.haomeiwen.com/i4993096/5be5139bc2e3e7d2.png)
那这两种形式在函数的提升中又有什么区别呢?我们看看下面的例子
![](https://img.haomeiwen.com/i4993096/15c9a93055758359.png)
![](https://img.haomeiwen.com/i4993096/11786e6c00d3e1d0.png)
为什么结果会不一样呢?其实我们把函数表达式var foo = function() { var foo = '123';}看成两个部分就好。一部分是var foo,而一部分是foo = function() { var foo = '123';},变量foo提升了,仅声明了,所以返回的结果是undefined。而下面是整个函数foo提升了。
第一次写小笔记 主要是方便自己查找 如有不足 麻烦大家点评
网友评论