javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结。

首先javascript是解释型语言,自然就是编译一行,执行一行。
js运行过程分为三步:
、语法分析
、预编译
、解释执行

语法分析就是指js引擎去判断检查你的代码是否存在语法错误,解释执行更不用多说,自然就是执行你的代码,然而重中之重的是预编译,预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 。

理解预编译首先要明白函数声明和变量赋值:

javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法。

在预编译中,javascript对这两种声明做出了两种处理方案:

 <script>
var a = "1";    //声明变量a
function b() {    //声明方法b
alert();
}
var c = function () { //声明变量c
alert();
}
</script>
以上代码块中,a、c为变量赋值,b为函数声明,当执行以上的代码时,首先会进入预编译阶段,对与变量赋值a、c会在内存中开辟一块内存空间并指向变量名,且赋值为undefined

预编译(函数执行前)

1. 创建AO对象(Active Object)
2. 查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined
3. 实参形参相统一,实参值赋给形参
4. 查找函数声明,函数名作为AO对象的属性,值为函数引用

 题目1:

  <script>
function fn(a) {
console.log(a)
var a = 123
console.log(a)
function a() {
} console.log(a)
var b = function () {
}
console.log(b)
function d() {
} console.log(d)
}
fn(1)
</script>  

 分析:

1)、创建AO对象

AO{

}

2)、查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined

AO{
a:undefined,
b:undefined,
}

3)、实参形参相统一,实参值赋给形参

 AO{
a:1,
b:undefined,
}

4)、查找函数声明,函数名作为AO对象的属性,值为函数引用

AO{
a:function a() {
},
b:undefined,
d:function d() {
}
}

变量、函数声明后代码顺序

    function fn(a) {
var a
var b function a() {
} function d() {
} console.log(a)
a = 123
console.log(a) console.log(a)
b = function () {
}
console.log(b) console.log(d)
}
</script>
解释执行

当执行到a=123之前时: 此时 console.log(a)打印的值为: function a() {}
  AO{
a:function a() {
},
b:undefined,
d:function d() {
}
}
当执行到a=123时: 此时 console.log(a)打印的值为:   
AO{
a:123,
b:undefined,
d:function d() {
}
}

 当执行到b = function () {}时:

此时 console.log(b)打印的值为: function () {}  console.log(d)打印的值为:  function d() {}

 AO{
a:123,
b:function () {
},
d:function d() {
}
}

 浏览器执行结果:

题目2:

<script>
function test(a, b) {
console.log(a);
c = 0;
var c;
a = 3;
b = 2;
console.log(b);
function b() {
} function d() {
} console.log(b)
}
test(1)
</script> 

 分析:

1)、创建AO对象

AO{

}

2)、查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined

AO{
a:undefined,
b:undefined,
c:undefined
}

3)、实参形参相统一,实参值赋给形参 

AO{
a:1,
b:undefined,
c:undefined
}

4)、查找函数声明,函数名作为AO对象的属性,值为函数引用 

  AO{
a:1,
b:function b() {
},
c:undefined,
d:function d() {
}
}

变量、函数声明后代码顺序

    function test(a, b) {
var a
var b
var c function b() {
} function d() {
} console.log(a);
c = 0;
a = 3;
b = 2;
console.log(b);
console.log(b)
} 
解释执行

当执行到function d() {}之前时: 此时 console.log(a)打印的值为: 
AO{
a:1,
b:function b() {
},
c:undefined,
d:function d() {
}
}
当执行到b=2之前时: 此时 console.log(b)打印的值为: 2  2
AO{
a:1,
b:2,
c:0,
d:function d() {
}
}

浏览器执行结果:

  

题目3:

 

<script>
function test(a, b) {
console.log(a);
console.log(b);
var b = 234;
console.log(b);
a = 123;
console.log(a);
function a() {
} var a;
b = 456;
var b = function () {
}
console.log(a);
console.log(b);
}
test(1)
</script> 

 分析:

1)、创建AO对象

AO{

}

2)、查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined  

  AO{
a:undefined,
b:undefined
}

3)、实参形参相统一,实参值赋给形参 

 AO{
a:1,
b:undefined
}

4)、查找函数声明,函数名作为AO对象的属性,值为函数引用

  AO{
a:function a() {
},
b:undefined
}

变量、函数声明后代码顺序

   function test(a, b) {
var a;
var b; function a() {
} console.log(a);
console.log(b);
b = 234;
console.log(b);
a = 123;
console.log(a);
b = 456;
b = function () {
}
console.log(a);
console.log(b);
}

 解释执行

当执行到function a() {}时: 
此时 console.log(a)打印的值为: function a() {} console.log(b)打印的值为: undefined

  AO{
a:function a() {
},
b:undefined
}

 当执行到 b=234时: 此时 console.log(b)打印的值为:

AO{
a:function a() {
},
b:234
}

当执行到 a=123时: 此时 console.log(a)打印的值为:

 AO{
a:123,
b:234
}

当执行到 b=456 时

 AO{
a:123,
b:456
}
当执行到 b = function () {}时: 
此时 console.log(a)打印的值为:  console.log(b)打印的值为: function () {}
 AO{
a:123,
b:function () {
}
}

浏览器执行结果:

javascript预编译和执行过程总结的更多相关文章

  1. 关于JavaScript预编译和执行顺序以及函数引用类型的思考

    昨晚在对项目中的一部分做模块化处理的时候,遇到了一个问题,一个重新定义的function对一个通用类中的function进行赋值覆盖的时候,失败了.问题抽象出来是这样的: <script > ...

  2. JavaScript-深入理解JavaScript(一、预编译和执行过程)

    一.预解析 JavaScript 在执行前会进行类似“预解析”的操作:首先会创建一个在当前执行环境下的活动对象, 并将那些用 var 声明的变量.定义的函数设置为活动对象的属性, 但是此时这些变量的赋 ...

  3. javascript的预编译和执行顺序

    原文:javascript的预编译和执行顺序 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题 代码: 代码一<html> ...

  4. javaScript 预编译过程浅尝

    javaScript 预编译过程 1.创建AO对象(Activation Object) AO{ a: } 2.找形参和变量声明,将变量和形参作为AO属性名,值为undefined AO{ a:und ...

  5. JavaScript预编译过程理解

    1-JavaScript运行三部曲 语法分析 预编译 解释执行 语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误: 解释执行顾名思义便是执行代码了: 预编译简单理解就是在内存中开辟一些空间 ...

  6. JS的预编译和执行顺序 详析(及全局与局部变量)

    最近在复习javascript的事件处理时发现了一个问题,于是总结一下:javascript的预编译和执行顺序的问题:   <html> <head> <title> ...

  7. JS的预编译和执行顺序 详析

    原文:JS的预编译和执行顺序 详析 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题   代码:   复制代码 代码一 <ht ...

  8. JavaScript预编译详解

    一.js运行三部曲: 1.语法分析(通篇扫描看有没有语法错误) 2.预编译 3.解释执行 二.预编译前奏 1.imply global 暗示全局变量:任何变量如果未经声明就赋值,此变量为全局对象所有 ...

  9. JavaScript 预编译与作用域

    JavaScript 预编译与作用域 JavaScript 预编译的过程和作用域的分析步骤是 JS 学习中重要的一环,能够帮助我们知道代码的执行顺序,更好理解闭包的概念 预编译 JavaScript ...

随机推荐

  1. hdu 1542/1255 Atlantis/覆盖的面积

    1542 1255 两道扫描线+线段树的入门题. 基本没有什么区别,前者是模板,后者因为是求覆盖次数至少在两次以上的,这个同样是具有并集性质的,所以把cover的判断条件更改一下就可以了qwq. hd ...

  2. python IDE安装-mac

    mac 配置Python集成开发环境(Eclipse +Python+Pydev)   1.下载Mac版64位的Eclipse. 进入到Eclipse官方网站的下载页面(http://www.ecli ...

  3. python获取IP位置来源

    import requests import IPy def get_location(ip): url = 'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2D ...

  4. [51nod] 1090 3个数和为0 暴力+二分

    给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到 ...

  5. PyQt5(1)——Qt Designer初探

    相关环境配置我们就不介绍了(网上有很多教程) Qt Designer 是一款十分强大的GUI工具,生成的文件为 .UI文件  可以通过命令转化为Py文件,简单来说我们可以通过拖拽方式生成界面,在通过简 ...

  6. docker安装MySQL软件

    1 搜索mysql镜像 $ sudo docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a wi ...

  7. NOIP前的模板

    1.筛\(phi\) \(logn\)求少数\(phi\) inline int phi(R int x){ R int res=x,tmp=x; for(R int i=2;i*i<=x;i+ ...

  8. NOIP模拟赛

    T1 1.聪明的小偷 (thief.pas/c/cpp) [问题描述] 从前有一个收藏家收藏了许多相同的硬币,并且将它们放在了n个排成一排的口袋里,每个口袋里都装了一定数量的硬币. 这些硬币价值不菲, ...

  9. FPGA基础学习(6) -- 原语

    目录 1. IBUF和IBUFDS(IO) 2. IDDR(Input/Output Functions) 3. IBUFG和IBUFGDS(IO) 原语,即primitive.不同的厂商,原语不同: ...

  10. [Ruby]Unzipping a file using rubyzip

    link: http://www.markhneedham.com/blog/2008/10/02/ruby-unzipping-a-file-using-rubyzip/ require 'ruby ...