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

###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. sql datetime操作

    Sql Server中的日期与时间函数 SQL中的时间函数非常有用,特别是在我们进行初始赋值.复杂查询的时候,就显得特别方便. 1.获得系统当前时间 select getdate()  2.DateN ...

  2. iOS 展示二级页面

    ViewController 调用 #import "ViewController.h" @implementation ViewController - (void)viewDi ...

  3. Maven概述

    Apache Maven的定义:Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model,pom),一组标准集合,一个项目生命周期(Project Lifecy ...

  4. C++静态成员函数小结(转)

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  5. php轮流排序,每隔一定的时间轮流进行位置排序,轮询的排行榜:function dataPollingInterval()

    /* * @名称: php ,对数组每隔一定的时间(自设定时间)来轮流进行位置排序,轮询的排行榜. 精确到指定的秒 或 分钟 或 小时 或 天 ,对数据列表进行轮排. * @参数: (array)$l ...

  6. OC 中 类目、延展和协议

    Category : 也叫分类,类目. *是 为没有源代码的类 扩充功能 *扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承 *该方法只能扩充方法,不能扩充实例变量 ...

  7. MVC的用法和作用

    最近在学习IOS项目的时候,老师经常提起MVC,在理解的过程中,越来越发现MVC的魅力,MVC:M:Model V:View C:Controller:Model 是用来存储数据的,View 是用来显 ...

  8. Sqlserver数据库总结

    由于公司项目需要这段时间一直在做有关于数据库方面的工作.趁这段时间有空,对数据库方面的知识进行一个梳理和归纳,以便以后需要时,查看起来方便. 使用的数据库主要有ORACLE10g和Sqlserver2 ...

  9. 20160113 JS中CheckBox如何控制全选

    //判断CheckBoxzong他的点击事件 $("#CheckBoxzong").click(function () { //取出所有class为选中的集合 var query ...

  10. CSS 知识点

    1:display:block:比较常用于<a><span>这两个标签——因为这两个标签非块元素,如果不用display:block定义一下,因为a标签没有结构,就是没有宽高, ...