一个函数的AO变化情况:
先赋值形参 才有fm函数的提升
fn运行带参数 :AO{n:undefined==>100,a:undefined==>20,function fm()}
fn运行无参数 :AO{n:undefined,a:undef,function fm(){}}
function fn(n){
var a=20
function fm(){
}
// return
}
fn(100)//AO{n:undefined==>100,a:undefined==>20,function fm()} 先赋值形参 才有fm函数的提升
fn()//AO{n:undefined,a:undef,function fm(){}}
函数有属性
1. length
2. name anxxxxxs
3.[scopes] 作用域
js对象有两种成员 一种是上文成员(js语法可以直接访问的成员) 一种是下文成员(底层语法可以访问的成员)
[[]]括起来的成员名就是下文成员
函数在创建定义/声明的时候 就有了[[scopes]]作用域 里面保存了上层的AO对象
函数调用时会生成AO对象--AO保存在scopes对象内部
函数生成了就会有一个属性[[scopes]] 作用域对象 (只能引擎使用)
函数调用时 生成AO对象 会把AO对象放在scopes
每次调用都会放在scopes前面(顶部 序列一)
每个函数scopes数组中天生就有一个AO对象 就是这个函数的上层AO
function fn(a) {
var a = 30
return function fun() {}
function fm() {//fm在fn的AO中生成时 就会生成一个fm的scopes
var b = 20
console.log(a);
}
fm()//第一个AO 顶端是fmAO 会引用fn的scopes排在fm的AO中(fm还没调用时就在fm的scopes中生成了 fm的AO再调用后生成) 因为fm可以调用fn中的变量
fm()//再调用fm 在fm的scopes中生成另一个AO
}
fn(100)//第一个AO 函数没运行时scopes中只有一个GO
fn(200)//再调用fn 重新调用生成另一个fn的scopes 中的fm函数又会生成另一个fm的scopes
var a=fn(0)
a.fun(100)
a.fun(200)//这两个都在fn中生成AO