先来做三个测试

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. Base64encode

    一直以来Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder/BASE64Decoder类.这个类是 ...

  2. eclipse 安卓运行一直跳转到调试模式

    最直接的办法,换手机试试,如果在其他手机上能run,那就重启手机即可 感觉写这么一点点似乎不足以发表一篇博客,给个链接吧:http://www.itnose.net/detail/6103213.ht ...

  3. mysql 中文字段排序( UTF8按拼音首字母排序)

    select * from tableName CONVERT( FieldName USING gbk ) COLLATE gbk_chinese_ci desc

  4. C# 语言规范_版本5.0 (第12章 数组)

    1. 数组 数组是一种包含若干变量的数据结构,这些变量都可以通过计算索引进行访问.数组中包含的变量(又称数组的元素)具有相同的类型,该类型称为数组的元素类型. 数组有一个“秩”,它确定和每个数组元素关 ...

  5. @property、@synthesize和dynamic的用法

    原文:  http://blog.csdn.net/hherima/article/details/8622948 @代表“Objective-C”的标志,证明您正在使用Objective-C语言 O ...

  6. 总结的OSM 地图相关的分析

    How OSM works:  Tile Format: png,  z: levels [0- 18], x: Latitude [0- ], y: Longitude [0- ];         ...

  7. Python基础(十三)-进程&线程

    进程 定义:进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的基本单位 线程

  8. tfs 清除缓存,在需要时

    C:\Users\xxx\AppData\Local\Microsoft\Team Foundation\5.0

  9. android 5.0 -- Ripple 效果

    Ripple 水波纹效果,也就是涟漪效果. 波纹效果有两种: 1,波纹有边界:波纹涟漪效果只是显示在控件内部 android:background="?android:attr/select ...

  10. 简单的 Android 拍照并显示以及获取路径后上传

    简单的 Android 拍照并显示以及获取路径后上传 Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap ...