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>

结果输出的是什么呢?

控制台输出的是2和4

原因如下

第一步:当一个<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.输出2和4

javascript中的预编译问题的更多相关文章

  1. JavaScript作用域原理——预编译

    JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数 ...

  2. js中的预编译

    预编译 js执行顺序: 词法/语法分析 预编译 解释执行 js中存在预编译 function demo() { console.log('I am demo'); } demo(); //I am d ...

  3. DelphiXE10.1项目中增加预编译的方法

    操作: 菜单选择Proceject->Options->Delphi Compilerz在Conditional Defines(第一行)中添加预编译标识.例:VCL代码:uses{$IF ...

  4. iOS中的预编译指令的初步探究

    目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...

  5. C中的预编译宏定义

     可以用宏判断是否为ARC环境 #if _has_feature(objc_arc) #else //MRC #endif C中的预编译宏定义 -- 作者: infobillows 来源:网络 在将一 ...

  6. C/C++中的预编译指令

    工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...

  7. C#中的预编译指令介绍

    原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...

  8. 在VisualGDB中配置预编译头加快编译速度

    今天是中秋佳节,但是写完已经是第二天凌晨了,还是祝大家中秋快乐! VS对C++的支持相较GCC太弱了,连续几个VS版本对C++的改进都很小.很少.对Cpper也许是一种痛,我们也许希望能使用VS的强大 ...

  9. JavaScript作用域及预编译

    几乎所有的编程语言都可以存储,访问,修改变量,那在JavaScript中这些变量放在那里?程序如何找到他们? js被归类于解释执行语言,但事实上他也是一门编译语言,因为他也要编译,但于传统的编译语言不 ...

随机推荐

  1. 【poj3744】 Scout YYF I

    http://poj.org/problem?id=3744 (题目链接) 题意 给出n个雷,分别在 a[1]...a[n] ,走一步概率为 p ,走两步概率为 1-p ,一开始在 1 号位置,问安全 ...

  2. 使用hexo,如果换了电脑怎么更新博客?

    自己今天想到这个问题,于是去知乎搜索了一番,发现不甚理想.没找到合适的,题目就是知乎原题.只好自己解决了.以下直接把自己的答案粘贴过来 今天我突然想到这个问题,想来参考参考,却发现都不太适合我.首先, ...

  3. java String类

    String 是一个类 所以他不是基本数据类型 而是引用数据类型 String 两种实例化方式:1.直接赋值 String name = "xxxxxx";2. String na ...

  4. 搜索框(Thinkphp5.0)

    1.普通关键词搜索框 模板部分代码: <form name='searchform' action='/index.php/module/controller/search' method='g ...

  5. JQuery------分页插件下载地址

    转载GitHub: https://github.com/pgkk/kkpager

  6. CSS样式表

    CSS样式及属性 样式标的基本概念 样式表的分类 1.内联样式表 和html联合显示,控制精确,但可重用性差,冗余多. 例:<p style="font-size:14px;" ...

  7. websocket

    websocket是一个协议,在单个TCP连接上提供全双工通信.  websocket被设计并被实现在 web浏览器和 web 服务器上,但是它可以被用于任何c/s 架构的应用程序中. websock ...

  8. 分享10款非常有用的 Ajax 插件

    这篇文章与大家分享的是10款非常有用的 Ajax 插件,有用于图片的,用于分页的,还有用于导航的.这些作者的想法特别新颖,希望你能从中找到自己需要的插件. 1. AJAX-ZOOM 非常强大的一款插件 ...

  9. Shell脚本学习第二课·

    Shell文件包含 shell也可以包含外部脚本,语法格式如下: . filename 或 source filename 例如创建两个shell脚本. 脚本1:test1.sh url = &quo ...

  10. [译]初识.NET Core & ASP.NET Core

    原文:点这 本文的源代码在此: ASP.NET From Scratch Sample on GitHub 你过你是.NET Core的入门者,你可以先看看下面这篇文章: ASP.NET and .N ...