js编译器的一些简单原理
有没有发现在写代码的时候,往往会遇到一些莫名其妙的错误,然后时间紧急不得不去网上查阅一些代码。虽然要实现的功能解决了,但是看被拷贝的代码好多真心看不懂,以后遇到诸如此类的问题,如果查阅不到这些代码的话还是不会。所以今天给大分享一下内部原理的问题
###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编译器的一些简单原理的更多相关文章
- Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)
Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...
- 前端工具 | JS编译器 Brace 使用教程
前言 开发人员一般是在电脑上面安装了IDE完成日常的开发任务,因为项目业务需求,用户想要在线写JS脚本,纯粹的字符串,很"费用户".那就需要一个在线JS编译器,需要轻量级,好用,语 ...
- JS基础(超级简单)
1 JS基础(超级简单) 1.1 数据类型 1.1.1 基本类型: 1) Number:特别注意:NaN的检测方法:Nan!=NaN;或者使用isNaN方法 2) ...
- JS去掉首尾空格 简单方法大全(原生正则jquery)
JS去掉首尾空格 简单方法大全 var osfipin= ' http://www.cnblogs.com/osfipin/ '; //去除首尾空格 osfipin.replace(/(^\s*)|( ...
- java中异常处理机制的简单原理
以上是自认为的java异常处理的简单原理,如有不妥之处还请各位大神帮忙指点,谢谢!
- js实用方法记录-简单cookie操作
js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...
- sChart.js:一个小型简单的图表库
介绍 sChart.js 作为一个小型简单的图表库,没有过多的图表类型,只包含了柱状图.折线图.饼状图和环形图四种基本的图表.麻雀虽小,五脏俱全.sChart.js 基本可以满足这四种图表的需求.而它 ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
随机推荐
- [UIImage resizableImageWithCapInsets:]
[UIImage resizableImageWithCapInsets:]使用注意 转自:http://www.cnblogs.com/scorpiozj/p/3302270.html 最近在sae ...
- Logistic回归小结
1.梯度上升优化 1). 伪代码: 所有回归系数初始化为1-------------------weights = ones((colNum,1)) 重复r次: 计算整个数据集的梯度gradient ...
- 字体Unicode编码
客专家福利 有奖试读&征文——我们在互联网上奋斗的故事 10月推荐文章汇总 加入“技术热心人”,赢丰厚奖品 html-中文字体在CSS中的显示(Unicode编码) ...
- Oracle数据库3
在前两章,我们学习了SQL语言中基本的一些查询语句,也就是数据库查询语言DQL,今天我们要介绍的数据库操作语言DML 数据库中,我们除了查询之外,最主要的就是日常的增.删.改.查了. 数据库操作语言 ...
- leetcode52. N-Queens II
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- C#基础知识系列十(集合)
前言 本节主要是来了解学习集合,以方便在程序编写时,什么地方该选用什么集合,让程序更健壮的运行起来.在学习了解集合之前,首先需要了解一些数据结构方面的知识.下面我们就先简单的来看一下数据结构. 数据结 ...
- mysql 把文件中的sql语句导入到mysql中
mysql -uroot -proot -Dcollege</home/wwwroot/default/data/xlxxb_2014-10-16.txt;
- 《C与指针》第五章练习
本章问题 1.这个表达式的类型和值为多少? (/) answer:The cast is applied to the result of the division,and because both ...
- jquery.cookie() 方法的使用(读取、写入、删除)
一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cookie.js 的配置 首先包含jQuery的库文件,在后面包含 jquery.cookie.js 的库文件. ...
- 关于java 中文乱码问题 自己的一点解决方案
早上做导出的时候,url拼接参数中文出现了乱码.查了半天.终于中午搞定了. 在web.xml中加了转码过滤器,tomcat的server.xml中也加入URIEncoding="UTF-8& ...