标签:赋值 简单的 log global efi nbsp 活跃 形参 on()
前几天在网上逛帖子的时候,看了几个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);
}
标签:赋值 简单的 log global efi nbsp 活跃 形参 on()
原文地址:https://www.cnblogs.com/xsg1/p/11131908.html