java函数ao活动对象_javascript预编译的过程-Go语言中文社区

预编译的两种情况

全局:

1.全局 直接是script标签中的代码,不包括函数执行

执行前:

1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析

2.分析变量声明,变量名为属性名,值为undefined

3.分析函数声明,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖

函数内部(局部):

1. 函数调用,也是会生成自己的作用域(AO:active object),AO活动对象. 函数调用时候,执行前的一瞬间产生的,如果有多个函数的调用,会产生多个AO

a.  函数执行前的一瞬间,生成AO活动对象

b. 分析参数,形参作为对象的属性名,实参作为对象的属性值

c.  分析变量声明,变量名为属性名,值为undefined,如果遇到AO对象上属性同名,不去做任何改变

d. 1.4 分析函数声明,函数名为属性名,值为函数体,如果遇到AO对象上属性同名,则无情覆盖

2. 逐行执行。

代码分析如下:

console.log(b)var a = 100;

console.log(a)var b = 200

var c = 300

functiona(){

}functionfun(){

}

console.log(a);

全局 直接是script标签中的代码,不包括函数执行

执行前:

1.首先生成一个GO(global object)对象,看不到,但是可以模拟出来用来分析

GO = {

自带的属性都不写

}

2.分析变量声明,变量名为属性名,值为undefined

GO = {

a : undefined,

b : undefined,

c : undefined

}

3.分析函数声明,函数名为属性名,值为函数体,如果函数名和变量名相同,则无情覆盖

GO = {

a : function a(){},

b : undefined,

c : undefined,

fun : function fun(){}

}

此时,GO就是预编译完成的最终对象,词法分析结束

4.逐行执行,分析过(变量声明,函数声明)不用管了,只管赋值(变量赋值)

11行的时候,a赋了一次值,值改变为100

GO = {

a : 100,

b : undefined,

c : undefined,

fun : function fun(){}

}

局部

var num = 100;functionfun(num){

console.log(num)

}

fun(5)

fun(10)

1.预编译的时候

GO = {

num : undefined,

fun : function

}

2.执行过程

走到9行

GO = {

num : 100,

fun : function

}

走到14行,函数的调用

3.函数调用,也是会生成自己的作用域(AO:active object),AO活动对象. 函数调用时候,执行前的一瞬间产生的,如果有多个函数的调用,会产生多个AO

3.1 函数执行前的一瞬间,生成AO活动对象

fun.AO = {

}

3.2 分析参数,形参作为对象的属性名,实参作为对象的属性值

fun.AO = {

num : 5

}

3.3 分析变量声明,变量名为属性名,值为undefined,如果遇到AO对象上属性同名,不去做任何改变

fun.AO = {

num : 5

}

3.4 分析函数声明,函数名为属性名,值为函数体,如果遇到AO对象上属性同名,则无情覆盖

4.逐行执行

综合分析:

console.log(test);

function test(test){

console.log(test);

var test = 123;

console.log(test);

function test(){

}

console.log(test);

var test = function(){}

console.log(test);

}

test(10);

var test = 456

console.log(test);

预编译开始,先生成一个GO{

}

1.看变量GO{

test:underfined

}

2.看函数声明GO{

test:function test(test){

console.log(test);

var test = 123;

console.log(test);

function test(){

}

console.log(test);

var test = function(){}

console.log(test);

}

}

把整个函数体给test

预编译完成,开始执行代码,第二行的结果是test函数的函数体

3到13行都是函数声明,不用管

第14行函数执行,传入参数10

函数执行的时候产生AO{

}

1.看参数AO{

test:10

}

2.看变量,变量同名,不用管变量AO{

test:10

}

3.看函数,函数和参数同名,函数把参数覆盖AO{

test:function test(){}

}

4.逐行执行

第三行打印名字为test的函数体,

第四行给test赋值123,第五行打印123

7到9行函数体声明不用管

第十行打印123

第十一行把一个匿名函数(没有函数名的函数)赋值给test

第十二行函数执行完毕

第十四行回到全局,把456赋值给test

第十五行打印456

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值