有没有发现在写代码的时候,往往会遇到一些莫名其妙的错误,然后时间紧急不得不去网上查阅一些代码。虽然要实现的功能解决了,但是看被拷贝的代码好多真心看不懂,以后遇到诸如此类的问题,如果查阅不到这些代码的话还是不会。所以今天给大分享一下内部原理的问题

###1.js编译器编译的几条基本原则

   >a.js预编译:解释函数声明,忽略表达式;

   >b.运行期间获取变量会有底层向顶层依次查找,直到找到为止(华续以前已经分享过);

   >c.变量的定义会被提前到body下,即所属代码最前面声明;

   >d.function func(){}这种声明会被js编译器解释成var func = function(){}这种格式,是不是看了几条规则,不知道我说的什么,没关系,可能我总结的不好,看下面例子具体了解下

###2.自执行函数/闭包
  >自执行函数,相信大家都接触过,只是不知道而已,在此不给出具体文字定义。

  >简单解释为:`类似(function(){...})()这种形式的代码就叫做自执行函数,又称闭包`他在js编译器解析到时,直接被执行。一个简单小例子: (function()
  >{...})()可以被自执行,写成function(){...}()可以被自执行吗,答:不可以!

  >如上面所说`规则a`,js预编译时,先解释函数声明,因此function(){...}()前面的function(){...}在‘预编译阶段’已经被解释成变量过了,js会跳过这段代码,试图去执行()里的内容,显然不科学;
  > 而(function(){...})()可以被自执行,因为它加了括号,它变成表达式了,js运行时会运行并对它求解得到一个返回值,而此处返回值是一个函数,故而遇到()便会执行

  >###例1:

    a=1;
    console.info(a)
    function b(){
      console.info(a);
      var a=10;
      console.info(a);
    };
    b();

    控制台打印:

      1,undefined,10

    你是不是预期是1,1,10,这里正是因为上面的`规则c`当js编译器在执行这个b函数的时候,会把把它body里面的声明变量提前到最前面进行声明。如:var a=10; 编译器先会在    body最前面进行var a 声明。其实上面的代码等同于下面的这段代码:

    a=1;
    console.info(a)
    function b(){
      var a;
      console.info(a);
      a=10;
      console.info(a);
    };
    b();

  声明a的时候还没有值,故而打印undefined;再看下面一个例子...

  ###例2:

    a=1;
    function b(){
      a=10;
      return ;
      function a(){};
    };
    b();
    console.info(a);

  控制台输出:1

    这里是因为上面的`规则b,d`在b函数中function a(){}实际是被编译成var a = function(){},函数内部有一个a=10,外部有一个a=1,先找内部的a,找到不会向外找,而根据js  作用域,最终打印1;

  ###3.使用场景

    有了上面的理论知识,可以解决曾经有人问我三元表达式后面怎么执行多条语句的问题,就是在后面写自执行函数。当然,不排除有其它方法,代码如下:

    var a = 2>1?(function(){var c=2,d=1;return c+d;})():(function(){var c=2,d=1;return c-d;})();
    console.info(a);

  控制台打印:3

  这种需求应该很少吧,我宁愿写个if,不过可以实现,呵呵...

js编译器的一些简单原理的更多相关文章

  1. Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)

    Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...

  2. 前端工具 | JS编译器 Brace 使用教程

    前言 开发人员一般是在电脑上面安装了IDE完成日常的开发任务,因为项目业务需求,用户想要在线写JS脚本,纯粹的字符串,很"费用户".那就需要一个在线JS编译器,需要轻量级,好用,语 ...

  3. JS基础(超级简单)

    1     JS基础(超级简单) 1.1 数据类型 1.1.1   基本类型: 1)        Number:特别注意:NaN的检测方法:Nan!=NaN;或者使用isNaN方法 2)       ...

  4. JS去掉首尾空格 简单方法大全(原生正则jquery)

    JS去掉首尾空格 简单方法大全 var osfipin= ' http://www.cnblogs.com/osfipin/ '; //去除首尾空格 osfipin.replace(/(^\s*)|( ...

  5. java中异常处理机制的简单原理

    以上是自认为的java异常处理的简单原理,如有不妥之处还请各位大神帮忙指点,谢谢!

  6. js实用方法记录-简单cookie操作

    js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...

  7. sChart.js:一个小型简单的图表库

    介绍 sChart.js 作为一个小型简单的图表库,没有过多的图表类型,只包含了柱状图.折线图.饼状图和环形图四种基本的图表.麻雀虽小,五脏俱全.sChart.js 基本可以满足这四种图表的需求.而它 ...

  8. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  9. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

随机推荐

  1. U盘格式化后的恢复

    软件:http://www.easeus.com/datarecoverywizard/free-data-recovery-software.htm

  2. json体会

    1.用json-lib的jar包,创建JsonObject的对象(其引用取名jo),JsonObject jo = new JsonObject(); 再创建一个jsonobject对象:JsonOb ...

  3. Spark随笔(三):straggler的产生原因

    首先,介绍前辈研究的基于MapReduce框架的outlier产生原因:其次,根据这些方面来分析Spark架构中的straggler:最后,根据阅览的优化办法,谈谈自己的看法. 一.MapReduce ...

  4. 系统不支持curl

    解决安装pinphp时出现的“系统不支持curl!”   今天在本机安装phppin开源程序时,提示“系统不支持curl!”错误. 由于我本机是UBUNTU系统,所以直接通过apt-get进行安装. ...

  5. jQuery 的原型关系图,整体把握jQuery

            若干个月前,在博客园中看到一篇文章,内容很简单,就是一幅图,展示的是 jQuery 中各对象之间的关系,当时就觉得,这就是我想要的最直观的总结 jQuery 的方式.在那篇文章中,也有 ...

  6. OD调试篇10

    今天破解一个用VB写的软件 先记住一个软件PEiD.exe 这是一个可以看出由什么语言编写程序的软件   非常好用 我把今天要破解的软件拖进去了,发现这就是一个用VB写的程序 这些呢是VB破解的关键 ...

  7. Linux压缩那些事儿

    tar简介 Linux的压缩命令的源文件只能有一个,这意味在压缩之前不得不先将要压缩的所有文件打包成一个包,然后再压缩包,这样来完成对多个文件的压缩.所以在了解解压缩之前就必须先了解打包命令. Lin ...

  8. Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting

    最近每天半夜,服务器都会出现崩掉的现象,pc  app 都不能正常使用 查看错误日志发现问题所在: [Wed Nov 09 08:07:28.651642 2016] [mpm_winnt:error ...

  9. 虚拟机VMBox的空间扩展和对加载进来资源的扩展

    来源于:http://www.linuxidc.com/Linux/2015-01/111186.htm 其中有点bug就自己重新复制黏贴下 VirtualBox虚拟机在使用的过程中,有时会遇到磁盘大 ...

  10. hdu1018

    可以用斯特林公式直接求出n!的结果. 当n较小时公式已经很准确了,所以可以使用.但是,对于这种极限值为1的公式,只能用来估计位数,不能作为严格的等于的公式.类似的有素数分布定理  x/ln(x)~f( ...