函数优先级大于变量优先级的深入探究————浏览器的预解析过程
来源:互联网 发布:程序员技术博客模板 编辑:程序博客网 时间:2024/06/07 02:57
函数优先级大于变量优先级的深入探究————浏览器的预解析过程
先由一道小题进入本文
var foo;function foo(){}console.log(foo);
结果是函数体function foo(){}
接着下面一道题:
function foo(){}var foo;console.log(foo);
结果也是函数体function foo(){}
所有就有很多人说,函数声明的优先级大于变量声明的优先级。那么,为什么呢?这就要从浏览器的预解析说起了。
预解析流程
- 搜寻预解析关键字
- 寻找var关键字
- 寻找function关键字
- 执行预解析
- 先应用var关键字声明的标识符,使这些标识符有定义
- 标识符有定以后,使用这项标识符就不会报错了
- 但因为没有赋值,因此其值为undefined
- 至此标识符中保存了函数的引用
- 先应用var关键字声明的标识符,使这些标识符有定义
几个需要注意的细节
- var 关键字对同一个标识符重复使用时,除第一次有效外,其他均做忽略处理。
- 预解析时先处理变量声明,再处理函数声明
- 不要纠结谁的优先级高,这些只是表面现象
- 懂得了预解析流程,一切都是浮云
看了预解析原理以后,下面咱们回到本文开头的两题,分析下预解析的过程,详细的了解为什么函数的优先级高于变量的优先级。follow me—->
先看第一个
var foo;function foo(){}console.log(foo);
预解析过程为:
var foo;<----变量声明的varvar foo;<----函数声明抽出的varfoo=function (){}<----函数声明抽出的赋值console.log(foo);
再来看第二个,
function foo(){}var foo;console.log(foo);
预解析过程为:
var foo;<----变量声明的varvar foo;<----函数声明抽出的varfoo=function (){}<----函数声明抽出的赋值console.log(foo);
比较这两个,你发现了什么?原来他们的预解析过程一样啊,这也就是为什么函数优先级高于变量的原因了。
如果你理解了上面的内容,那么下面再出一个题:
var a=1;function a(){}console.log(a);
这个浏览器是如何解析的呢?下面来跟着我的思路一起走:
1. 解析器首先搜寻var 关键字,结果第一行就发现了,把它提取到开头。
2. 解析器搜寻function关键字,第二行发现了,首先分离var+函数名,此时发现和第一步的一样,不做处理,然后开始分离函数的赋值,也就是a=function (){}
,此时a为函数体。
3. 解析器接着处理变量的赋值,a=1
,上一步的函数体被覆盖掉,此时a=1。
4. 最后处理console.log(a)
,自然而然的结果为1。
下面是解析器处理的代码过程:
var a;<----变量声明的varvar a;<----函数声明抽出的vara=function (){}<----函数声明抽出的赋值a=1;console.log(a);
先整理到这里,有什么错误和疑惑欢迎指出来。
1 0
- 函数优先级大于变量优先级的深入探究————浏览器的预解析过程
- linuxIPC——进程执行的优先级
- 堆的应用——优先级队列
- 堆的应用——优先级队列
- CSS——选择器的优先级
- C语言中+的优先级大于>>
- Javascript 函数声明 的优先级 高于 变量声明的优先级,但 不会 覆盖变量赋值
- 线程函数的优先级
- 浏览器解析编码优先级
- 深入 Linux 的进程优先级
- 深入 Linux 的进程优先级
- Android基础总结——进程优先级及提高优先级的方法
- JavaScript函数声明、变量声明及赋值的优先级问题
- 数据结构——图的邻接矩阵的广度优先级搜索
- Java数据结构与算法解析(十三)——优先级队列
- Java数据结构与算法解析(十三)——优先级队列
- Java数据结构与算法解析——优先级队列
- Java数据结构与算法解析(十三)——优先级队列
- eclipse对jdk版本的要求
- Data Binding给Button设置背景无效
- 负载均衡环境中和如何设置Expires和Etag
- gpexpand扩展集群节点过程及问题解决
- Mysql中的视图
- 函数优先级大于变量优先级的深入探究————浏览器的预解析过程
- sql server小数四舍五入,保留
- 文章标题
- android 网络图片显示
- oracle查询某个时间段的数据
- 学习笔记之JavaSE(21)--多线程1
- hdu 1421 搬寝室 dp
- 数据结构--线性表详解(一)
- android 读取本地文件的一种方式