js解析与执行过程分为全局与局部
1:全局,预处理阶段===>执行阶段
2.局部(函数),预处理阶段===>执行阶段
全局:预处理
全局的词法环境===window{
a:undefined
b:对函数的一个引用
}
在全局下找到:
用var定义的变量 eg:var a=5
用声明方式创建的函数 eg:function b(){} ,加入到全局的词法环境中
console.log(a); //undefined
console.log(b); //报错
console.log(c); //函数体
console.log(d); //undefined
var a=2;
b=1;
function c(){alert(11)}
var d=function(){}
f(); //弹出fff
g(); //报错
function f(){alert('fffff')};
var g=function(){alert('ggg')}; //函数表达式
预处理阶段先扫描函数声明后扫描用var的变量声明
//处理函数声明有冲突会覆盖
a(); //function a(){alert(222)};
function a(){alert(111)};
function a(){alert(222)};
处理变量声明有冲突会忽略
a(); //function a(){alert(111)};
function a(){alert(111)};
var a=11111;
执行阶段:从上到下执行,碰到全局词法下有的覆盖其值,没有的则加入全局词法
局部(函数)预处理:
每调用一次产生一个词法环境
先函数的参数
内部声明式函数
内部var变量
冲突情况与全局处理一样
如果没有用var声明的变量,会变成最外部词法环境的成员