先来做三个测试

eg1:

 var a;
 a = 1;

 function a() {};
 console.log(a);

eg2:

 var a;
 function a() {};
 console.log(a);

eg3:

 var a;
 function a() {};
 a = 1;
 console.log(a);

eg1:输出1   eg2:输出a方法   eg3:输出1

为什么输出结果是这样的?

先来看看js预编译实现过程:

  1.js首先扫描var关键字,提前到顶端;

  2.然后扫描function定义,提到var之后

  3.然后再顺序执行

那么上面的三个例子预编译形式分别如下:

eg1:

 var a;

 function a() {};
 a = 1;
 console.log(a);

eg2:

 var a;

 function a() {};
 console.log(a);

eg3:

 var a;

 function a() {};
 a = 1;
 console.log(a);

了解预编译过程后可以再来看看下面几个例子,试着先做一下

  1.

f();
function f(){
    console.log("a");
}

==========================================
f();
var f = function(){
    console.log("a");
}

第一个程序 运行输出:1 ;第二个程序运行报错,f is not a function()  

  2.

function f(){
    console.log("a");
}
f();
function f(){
    console.log("b");
}
f();
==========================================
function f(){
    console.log("a");
}
f();
var f = function(){
    console.log("b");
}
f();
=============================================
var f = function(){
    console.log("a");
}
f();
function(){
    console.log("b");
}
f();

第一个输出:b b   ;   第二个输出:a b   ;    第三个输出:a a

js引擎读取一段js代码,首先预编译,寻找全局变量和全局函数,遇到全局变量,把变量的值变为undifined存放在内存中,并不进行赋值操作,遇到全局函数,也是存放在内存中,如果这个过程中发现语法错误,预编译终止。

js预编译的更多相关文章

  1. Handlebars.js 预编译(转)

    Handlebars.js 官网上对预编译1是这样说的: 你需要安装 Node.js 你需要在全局环境中,通过 Npm 安装 handlebars 包 然后你就可以通过命令预编译你的 handleba ...

  2. 关于js预编译以及js文件执行顺序的几个问题。

    关于js的执行原理,除去html页面中直接添加的代码,js代码的放置可以分为两类. //情形a           <script type="text/javascript" ...

  3. JS预编译详解

    我们都知道javascript是解释型语言,执行的特点呢是编译一行,执行一行.按照这个思路有时候我们在运行代码时会有一些令人费解的现象出现.下面我们一起来执行下面三段代码. <script> ...

  4. js预编译的四部曲

    众所周知javascript是解释性语言,主要特点为解释一行执行一行. 而在js运行时会进行三件事:1语法分析  2.预编译  3.解释执行 语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错 ...

  5. js 预编译

    js 运行代码的时候分为几个步骤:语法分析 ==>预编译  ==>解释执行 语法解析:通篇扫描代码,查看语法是否出错 解释执行:读一行 - 解释一行 - 执行一行 预编译执行的操作: // ...

  6. js预编译和函数执行

    javascript 执行过程 1.语法检测(有没有基本的语法错误,例如中文,关键字错误...)2.词法分析(预编译) (1)创建全局GO(global object)对象 (2)对var声明的变量进 ...

  7. js预编译环节 变量声明提升 函数声明整体提升

    预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a) ...

  8. JS预编译过程

    GO和AO 变量的预编译 实例1 console.log(a); var a=1; console.log(a); 实际编译过程: 将a存入预编译对象中,赋值为undefined: 真正的赋值语句当程 ...

  9. Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题

    调用bootstrap css框架时,将bootstrap文件夹放入 vendor/assets/下 bootstrap文件结构如下:    [shenma@localhost demo]$ ls v ...

随机推荐

  1. 在GNU/Linux下将CD音乐转为mp3

    以前我欣赏古典音乐都是听的CD,因而珍藏了不少光盘以及下载到电脑上的ape与flac格式的音乐文件.随着手机硬件性能(如电池续航能力.处理器速度.音质.存储容量等)和软件功能(音乐播放器对于曲目的管理 ...

  2. CentOs + Nginx + php-fpm + MySql 依赖库安装

    依赖库和开发工具 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype free ...

  3. 快乐编程学ruby

    人们常说:不忘初心,方得始终.所以,code除了完成工作任务,在最初还应该是富于乐趣的,正所谓,宅男配女仆,我们来了解了解我们的ruby 萌妹子吧:-).                       ...

  4. jQuery的animate在火狐浏览器上不支持backgroundPositionX的解决方法

    在网上找的ffSupp.js文件 /** * 自定义backgroundPosition的animate,支持火狐,jQuery1.8以上版本 * @author Meleong * v1.00 */ ...

  5. iOS CFStringTransForm汉字转拼音

    CFStringTransform - (NSString *) phonetic:(NSString*)sourceString { NSMutableString *source = [sourc ...

  6. each用法的总结

    1.选择器+遍历 $('div').each(function (i){ i就是索引值 this 表示获取遍历每一个dom对象 }); 2.选择器+遍历 $('div').each(function  ...

  7. save-dev和save的区别

    果你经常用NPM安装依赖包,会注意到安装包时的指令会分--save-dev和--save两种,有什么区别呢?   在项目中我们通常会有一个package.json的配置文件,用来保存项目的相关配置信息 ...

  8. iframe标签flash遮盖页面元素问题——wmode参数

    最近做项目过程中,遇到各种小问题,所以打算通过博客园来记录各问题的解决办法. 这篇的问题背景是这样子的:项目是用的AngularJS框架,在某个页面上用了wangEditor富文本编辑器插件(gith ...

  9. Javaweb 第7天 Servlet课程

    Servlet课程 三日大纲 ● 网络概念,专业术语 ● Tomcat使用,发布网站,使用Myeclispe发布网站(搭建环境) ● 编写Servlet,Servlet生命周期 ● 用户注册,显示所有 ...

  10. TESTNG重试、截屏、监听

    http://qa.blog.163.com/blog/static/19014700220138585422735/