使用AO和GO判断执行顺序
一.首先理解全局变量和暗示全局变量
1.全局变量:含有声明的变量
eg:var a = 10;
2.暗示全局变量:不含有声明就赋值的变量
eg:a = 10;
二.其次理解全局变量和局部变量
1.全局变量:函数体外声明的变量称为全局变量
2.局部变量:函数体内声明的变量称为局部变量
三.知道AO的执行顺序
AO用来判断函数体内的执行顺序,通常分为四个步骤
1)首先创建AO对象(执行期上下文)
2)找到形参和变量声明,将变量与形参名作为AO属性名,值为undefined
3)将实参和形参统一
4)在函数体内找到函数声明,值赋予给函数体
四.知道GO的执行顺序
GO用来判断的是函数体外的执行顺序,通常需要根据执行顺序来判断输出的是GO还是AO,具体我在示例中详细描述
五.示例
<script>
a = 100 ;
function demo(e){
function e(){};
arguments[0] = 2; //arguments是一个传递参数的局部变量,它将e的值赋值给了2
document.write(e);
if(a){
var b = 123;
function c(){} //最新谷歌不允许if中存在函数声明,所以该内容无法进入AO了
}
var c;
a = 10;
var a;
document.write(b);
f = 123;
document.write(c);
document.write(a);
}
var a;
demo(1);
document.write(a);
document.write(f);
</script>
我们先来列出GO,看函数体外面 存在一个a 将它放入AO 值为undefined 另外存在一个function demo,我们之后在AO中再执行,看a执行了等于100,GO中的A改变为100
GO{
a=undefined ——>100
}
然后执行AO,找形参和变量声明,形参为e 变量声明有 b c a 放入到AO中值为undefined,然后将实参和形参统一,就是将1的值给e 所有e发生改变为1,最后找函数声明function e(){};将它赋值给e,c的函数声明不执行已经注释解释了,
AO{
e=undefined——>1——>function e(){}
b=undefined
c=undefined
a=undefined
}
接下来开始从头到尾执行一次函数
第一行a = 100 ;已经在GO中列出
第四行 arguments[0] = 2 e的值发生改变为2 在 AO中标记一下
下一句打印e为2
然后if内的a为undefined,不执行
接下来遇到局部变量a变成了10 AO中标记
打印b值从AO中找undefined
遇到未声明的全局变量f=123在GO中标记一下(暗示全局变量f)
下一句打印c发现c为undefined
再打印a发现a是10
再往下走出了函数体,主要要用GO内的全局变量
打印a=100
打印f=123
所以最后的结果:2undefinedundefined10100123
下面为AO GO执行的最后的结果
AO{
e=undefined——>1——>function e(){}——>2
b=undefined
c=undefined
a=undefined——>10
}
GO{
a=undefined ——>100
f=123
}
浏览器运行结果: