笔者在这里附上一段代码,请读者思考一下程序的运行结果:

        console.log(a);  //???
a();
var a=3;
function a(){
console.log(10);
}
console.log(a);//???
a=6;

  

  运行结果如下:

  

     console.log(a);  //输出function a(){}
a();
var a=3;
function a(){
console.log(10);
}
console.log(a);//
a=6;

    

不知道读者有没有猜对呢?哈哈,可能很多读者会认为第一行的console.log(a);会输出undefine ,因为大家都知道变量提升与函数提升,而Javascript编译器执行代码也是逐行执

行,当js文件首先加载到内存时,编译器便会对代码执行预编译,将代码中的var 声明与function声明提升到头部,再一行行的去执行代码,那这样的逻辑的话,可能读者会想,既然

变量提升,上面的代码在预编译期间应该首先会提升var a,再提升function a(){}, 等执行console.log(a)的时候,自然输出undefine,没有被定义才对啊。

这里向读者强调一下一个容易被忽视的小问题。,虽然JS预编译期间会对var 和 函数声明提升,但是函数声明提升是优先于变量提升的(也适用于函数字面量声明的情况,这

里不做演示),所以应该是先提升function a(){}.再提升var a,所以第一行输出了function a(){},有没有一种恍然大悟呢?哈哈。

 而console.log(a);这一行为什么输出3而不是6或者function a(){} 呢,我们再回忆一下JS已经将function a(){} 与var a 提升到了头部,首先分析末尾的代码a=6;这行代码编译器

并没有执行到这一行,所以忽略,现在就是纠结到底是3还是function a(){},,而输出结果却告诉我们是3,至于已经声明过的function a(){},去哪里了呢。

 这里为读者解析一下程序的运行状态,在我们预编译阶段function a(){}和var a已经存在于内存中,只是这时var a并没有被赋值,而接下来执行了a(),这里我们要强调一下,

每种语言都有垃圾回收机制,程序中已经用过的函数,当他执行完毕后,便会被当做垃圾回收掉,而a()执行完后 ,便会被回收,而内存里面只剩下了var a; 接下来再执行下一

句var a=3;所以末尾的console.log(a);便输出了3 而不是function a(){}。

   总结:第一、JS预编译阶段函数声明提升优先于变量提升,第二、当函数被使用后,便会被垃圾回收。

   

   

对Javascript到底了解多少,一测便知道的更多相关文章

  1. JavaScript到底是不是单线程

    JavaScript到底是不是单线程 JavaScript引擎 在了解计时器内部运作前,我们必须清楚一点,触发和执行并不是同一概念,计时器的回调函数一定会在指定delay的时间后被触发,但并不一定立即 ...

  2. web前端分享JavaScript到底是什么?特点有哪些?

    web前端分享JavaScript到底是什么?特点有哪些?这也是成为web前端工程师必学的内容.今天为大家分享了这篇关于JavaScript的文章,我们一起来看看. 一.JavaScript是什么? ...

  3. JS转换HTML转义符,防止javascript注入攻击,亲测可用

    function removeHtmlTab(tab) {  return tab.replace(/<[^<>]+?>/g,'');//删除所有HTML标签 } functi ...

  4. JavaScript 开发的 睡眠状况自测(SRSS)

    Javascript 开发睡眠状况自测程序,手记!2019.11.13日... <script>//初始化fbox = new Findpair('fbox','output');fbox ...

  5. 浅谈模块化的JavaScript

    模块化JavaScript之风早已席卷而来, CommonJS . AMD . NodeJS .RequireJS . SeaJS . curljs  等模块化的JavaScript概念及库扑面而来, ...

  6. Unobtrusive JavaScript 是什么?

    Unobtrusive JavaScript 是什么? <!--以下是常规Javascript下写出来的Ajax--><div id="test">< ...

  7. 对JavaScript 引擎基础:Shapes 和 Inline Caches

    全文有5个部分组成 1.JavaScript 引擎工作流程:介绍 JavaScript 引擎的处理流水线,这一部分会涉及到解释器/编译器的内容,且会分点介绍不同引擎间的差别与共同点: 2.JavaSc ...

  8. JavaScript 引擎基础:Shapes 和 Inline Caches

    JavaScript 引擎基础:Shapes 和 Inline Caches hijiangtao ​ 中国科学院大学 计算机应用技术硕士 260 人赞同了该文章 前言:本文也可以被称做 “JavaS ...

  9. 深入理解JavaScript系列:JavaScript的构成

    此篇文章不是干货类型,也算不上概念阐述,就是简单的进行一个思路上的整理. 要了解一样东西或者完成一件事情,首要的就是先要搞清楚他是什么.作为一个前端开发人员,JavaScript应该算作是最核心之一的 ...

随机推荐

  1. [学习OpenCV攻略][006][平滑图片]

    cvCreateImage(图片大小,像素位数,通道数) 创建图片,根据输入的图片大小,各个通道像素点的位数,和通道数.像素点宏IPL_DEPTH_8U cvGetSize(图片) 得到图片的大小信息 ...

  2. <input type="text">和<textarea>的区别

    在我们开发时经常需要用到输入框,通常解决办法就是<input type="text">和<textarea>,那么这两个标签有什么区别呢?  一:<i ...

  3. Putty(菩提)远程连接服务器教程听语音

    Putty是一款优秀的免费串行接口连接软件,由于其绿色和性能深受业界好评,绿色是指putty使用便捷只需要将putty下载到电脑,无需安装,只需要在电脑上新建一个快捷方式就可以使用.出色的性能是指pu ...

  4. 实现LNMP

    实现LNMP 环境: linux系统机器 A:一台N:nginx,ip:192.168.213.251 B:一台P:php-fpm,php-mysql ,ip:192.168.213.253 C:一台 ...

  5. jstl 的判断使用

    JSTL  是JSP的标准标记库 1.必须引入的头部标签 <%@ taglib uri="http://java.sun.com/jstl/core_rt"prefix=&q ...

  6. Java 运动模糊

    Java 运动模糊代码 想用Java 写个运动模糊的效果,无奈本人水平有限,国内也没找到资源,于是Google到了一个文档,特地分享出来! 本代码源自 http://www.jhlabs.com/ip ...

  7. java.lang.NoClassDefFoundError: javax/mail/Authenticator

    摘录自:http://stackoverflow.com/questions/1630002/java-lang-noclassdeffounderror-javax-mail-authenticat ...

  8. jQuery --- 实现 checkbox 样式的单选框

    早就想写点博客了 一直懒着动  最近发现一些写过的东西都不记得了,下决心把自己平时遇到的问题.得到的经验记录下来,希望能大家一点帮助 这是之前写的一个模态框 要求单选 但是 要求radio的默认样式 ...

  9. 一次线上tomcat应用请求阻塞的排查经过

    今天早上,收到一个报警,有个服务器的http往返时延飙升,同时曝出大量404,很是折腾了一番,特记录下思考和排查经过. 1.这是单纯的时延增大,还是有什么其他情况还未掌握? 因为不知道是只有时延变大而 ...

  10. 关键字final整理

    关键字final整理 由于语境(应用环境)不同,final 关键字的含义可能会稍微产生一些差异.但它最一般的意思就是声明"这个东西不能改变".之所以要禁止改变,可能是考虑到两方面的 ...