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项目 安装 ...
随机推荐
- java堆、栈、堆栈的区别
1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CP ...
- HTML编码规则、CSS属性声明顺序--简介
From AmazeUI:http://amazeui.org/getting-started/html-css-guide HTML 属性顺序 HTML 属性应当按照以下给出的顺序依次排列,确保代码 ...
- innerHTML,innerText,outHTML,outText区别
<p><div id="div" style="background-color:#ff9966;border:1px #ff0000 dashed;& ...
- 【Avalon】factory
(function(global, factory) { if (typeof module === "object" && typeof module.expor ...
- springboot系列之-log
配置文件以application.yml为例说明: Spring Boot默认的日志组件为Logback. 一. 日志配置参数: logging: file: #日志文件,绝对路径或相对路径 path ...
- 腾讯优测| 让Android屏幕适配开发更简单-Google百分比布
文/腾讯优测工程师 吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼 ...
- EntityFramework 基础的crud
EntityFramework 基础的crud操作 根据上一张实体映射的demo学习基础的crud操作 1.增加 BlogDbContext dbContext = new BlogDbContext ...
- bootstrap-7
基础表单: 表单中常见的元素主要有:文本输入框.下拉选择框.单选按钮.复选按钮.文本框和按钮等. bootstrap并未对齐做太多的的定制化效果设计,仅仅对表单内的fieldset.legend.la ...
- sscanf格式化输出
char DesChar[20] = {0}; char* SouChar= "1cZCD23456abEFdedfB"; sscanf(SouChar,"%[^A-Z] ...
- javascript:void(0) ,设置a链接无效,设置点击a页面不刷新,不跳动
http://www.cnblogs.com/opper/archive/2009/01/12/1373971.html 我想使用过ajax的都常见这样的代码: <a href="ja ...