全局上下文GO与函数上下文AO
Posted xsg1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全局上下文GO与函数上下文AO相关的知识,希望对你有一定的参考价值。
前几天在网上逛帖子的时候,看了几个Js的题,发现都是关于GO与AO的一些应用,正好自己也重新回顾一下。
先看题:(PS:如果有兴趣做做题的小伙伴,可以在下方评论说出自己第一感觉的答案哦)
1.
var a = 1;
function a()
console.log("aa");
;
function test();
console.log(a);
2.
function test(a)
console.log(a);
var a = 1;
console.log(a);
function a();
console.log(a);
var b = function();
console.log(b);
function d()
test(2);
答案:
第一个:输出a为:1
第二个:输出:function a(),1,1,function ()
下面简单的说一下GO与AO
GO:全局上下文,Global Object,它在全局代码执行前产生
产生的时候做了什么呢?分为以下几个步骤:
1:寻找变量声明
2:寻找函数声明,赋值
3:代码执行
AO:Activation Object 活跃对象,函数上下文,在函数执行前产生
产生的时候做了什么呢?分为以下几个步骤:
1:寻找形参和变量声明
2:实参赋值给形参
3:寻找函数声明,赋值
4:代码执行
分析第一题:
主要是GO
GO =
a:undefined (寻找变量声明)
->function a() (寻找函数声明赋值)
->1 (代码执行)
test:function test() (寻找函数声明赋值)
所以代码执行到console时,此时a已经被赋值1,输出1
第二题:
首先是GO
GO =
test:function test()... (寻找函数声明赋值)
当test函数要执行时,创建AO
AO =
a:undefined (寻找形参和变量声明)
->2 (实参赋值给形参)
->function a()... (寻找函数声明,赋值)
->1 (代码执行)
b:undefined (寻找形参和变量声明)
->function()... (代码执行)
d:function d()... () (寻找函数声明,赋值)
}
首先看第一个a的输出:由于输出是在a=1之前,所以输出function a()
第二个a的输出:在a=1之后,赋值完成,所以输出1,
第三个a的输出:由于function a()在AO中已经赋过值,此时直接跳过,输出1
b输出:function()...
最后有道题,小伙伴们自己分析分析,看看结果和自己想的是不是一样(提示要同时考虑GO与AO哦)
a = 1;
function test(e)
function e();
arguments[0] = 2;
console.log(e);
if(a)
var b = 3;
var c;
a = 4;
var a;
console.log(b);
f = 5;
console.log(c);
console.log(a);
最后结果是:2,undefined,undefined,4,1,5 看看你们的答案是否一致哦,加油!
以上是关于全局上下文GO与函数上下文AO的主要内容,如果未能解决你的问题,请参考以下文章