函数有属性
length name [[scoped]](现在叫scopes)
js对象有两种成员 一种是上文成员(js语法可以直接访问的成员)
一种是下文成员(底层语法访问的成员)
用[[]]括起来的成员名 就是下文成员
function fn(){
}
console.dir(fn)
这个“对象”内部保存的就是函数的作用域
函数在定义/声明的时候 就有了[[scopes]] 里面保存上层的AO对象
函数调用时生成AO对象 AO对象保存在scopes对象内部
函数生成了就会有个属性[[scopes]] 作用域对象(只能引擎使用)
函数调用时生成AO对象 把AO对象保存在scopes对象内部
每次调用都会放在scopes前面(顶部)
每个函数scopes数组中天生就有一个AO对象 就是这个函数上层的AO
function fn(){
var a=20
function fm(){
var b=30
console.log(a)
}
fm()
fm()
}
fn()
fn()
例:
function fun(n,o){
console.log(o)
return{
fun:function(m){
return fun(m,n)
}
};
}
var a =fun(0)//undefined o没有赋值
a.fun(1)//0 a.fun上没有n 在上层AO里找 也就是调用fun产生的AO对象 n=0
a.fun(2)//0
a.fun(3)//0
var b = fun(0).fun(1).fun(2).fun(3)//undefined 0 1 2
//每次调用都会生成新的AO对象 上层AO中的n值作为下一次调用的o值
var c =fun(0).fun(1)//undefined 0
c.fun(2)//1 和上面同理 只是这两次是分开调用生成新的AO对象不会保存到下次
c.fun(3)//1