博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript中的预编译问题
阅读量:4476 次
发布时间:2019-06-08

本文共 1021 字,大约阅读时间需要 3 分钟。

Js作为脚本语言,可以不需要编译直接运行,但遇到类似变量或者函数同名,预编译方面的知识可以帮助我们更好解决问题.

示例:

这是一段js中普通的函数调用代码

<script>

1.    //var demo=undefined
    
    
2.    demo(1,2);
3.    function demo(a,b){
4.        console.log(b);
5.    }
6.    var demo = function(a,b){
7.        console.log(a);
8.    };
9.    demo(4,3);
</script>

结果输出的是什么呢?

控制台输出的是24

原因如下

第一步:当一个<script>出现的时候,v8解释器先扫描所有的代码,寻找所有代码中哪里有var,先把var提出来,凡是有var的先拿出来,这叫预编译.还没执行之前,还没加载整个文档之前,v8解释器在加载当前页面包体的时候,先去判定有没有var,var就把var后面那个变量拿出来先付undefined,也就是说,页面加载前,它先扫描到了第6行的var demo,执行的第一句话是var demo = undefined,也就是第一行的代码,这个demo在栈里,而当前的function还没有被加载到内存.

第二步:然后它扫描var以后,开始找谁是function,注意,是谁是function而不是谁是function的表达式,这两者是有区别的,function demo(){}为函数声明,var demo=function demo(){}为变量赋值.function本身是加载到堆里的,在内存堆里面,它是先被加载执行的,所以第二步是加载function demo(a,b).

第三步:执行demo(1,2),因为我先加载了function,后面已经找到demo,输出2.

第四步:然后向下执行,因为在开始时demo已经被赋为undefined,那时demo是在栈里,6行代码就相当于把=后面那一大坨代码塞到栈里了,但为什么它在栈里还能被执行,这个就是v8帮你做的.然后此时的function会把上面第三行的堆里的function里的入口地址直接覆盖掉了,所以下面的demo(4,3)调用的不再是第一个function,而是第六行的function.输出24

转载于:https://www.cnblogs.com/yuqing-o605/p/6202527.html

你可能感兴趣的文章
HashMap完全解读
查看>>
匿名内部类
查看>>
man命令重定向后有^H乱码问题
查看>>
自定义popupwindow(解决位置控制困惑)
查看>>
BZOJ4071: [APIO2015]八邻旁之桥
查看>>
Redis的六种特性 场景
查看>>
mysql 添加[取消]timestamp的自动更新
查看>>
码农的半衰期只有15年?
查看>>
手工释放linux内存
查看>>
2014-5-30 总结
查看>>
【H3 BPM工作流程管理产品小故事】第四篇 子表创建
查看>>
洛谷P1148 拱猪计分
查看>>
MySQL服务器的安装和配置,MySQL Workbench 8.0.12安装,MySQL的基本使用
查看>>
扑克序列
查看>>
java笔记--适配器模式的运用
查看>>
第一次研究VM程序中的爆破点笔记
查看>>
看雪CTF 2016( 原:CrackMe攻防大赛) 第一题分析
查看>>
JavaWeb--中文乱码
查看>>
二叉树——套路化解题--1.最大搜索二叉子树
查看>>
python测试工程师高端基础面试题整理
查看>>