分析代码是否正确
function fm(a){
console.log(a);
var a=20
function fn(){}
console.log(a);
}
var b=100
fm(b)
1.隐式操作 预编译
var
function
2.形式函运==》函数调用了以后 在运行代码之前
会生成一颗对象:执行期上下文对象(AO):函数每次调用都会生成
2.1.给AO对象添加成员:函数内部的局部变量和形参变量 名 作为AO对象的属性名 赋值undefined
AO:{
a:undefined
a:undefined 形参和局部变量一样的时候 不影响
}
2.2.把传入的实参赋值给AO对象的属性
AO:{
a:100
}
2.3.局部函数的声明,赋值 把局部函数的名字让AO对象也有一个一样的成员名 把函数体赋值给这个属性
AO:{
a:100,
fn:function fn(){}
}
3.运行代码预编译过的就不在运行
AO:{
a:100,
fn:function fn(){},
console.log(a);//100
a=20 //运行之后a被覆盖
console.log(a);//20
}
// 全局作用域运行代码时也又有预编译 ==》全局预编译
1.生成一个对象Gobal
GO:{}
2.把所有的全局变量 设置为GO的属性名
GO:{a:undefind}
3.把所有函数名作为GO的成员名 把函数体赋值给这个成员
GO:{a:undefind,fn:function fn(){console.log(66)}}
4.执行代码
GO:{a:undefind,fn:function fn(){console.log(66)}}
console.log(a); //a=undefind
a=20 //a=20
全局预编译还有一部==》不同的环境中运行js代码不一样
GO对象的成员全部浅拷贝给环境对象window
node.js环境中没有这一步
拓展:关于访问成员 console.log(a) 访问的是GO对象的成员(作用域链中没有就报错)
console.log(window.a)不报错 原型链也没有 返回undefined