image.png
样例
var fun = function(x,y){
if(true){ //不能创建作用域
var a = 11;
}
var foo = function(){
console.log(a)
}
foo(x,10)
}
fun()
上下文 函数栈
//JavaScript引擎会以栈的方式来处理它们,
//这个栈,我们称其为函数调用栈(call stack)。
//栈底永远都是全局上下文,而栈顶就是当前正在执行的上下文。
//数据结构 并不表示数组
ecstack = [
////栈顶
<foo>functionContext
<fun>functionContext
globalContext
////栈底
]
创建阶段
(executionContextObj = {
variableObject: { /* 函数中的参数对象并给参数赋值, 内部的变量以及函数声明 */ },
scopeChain: { /* variableObject 以及所有父执行上下文中的variableObject */ },
this: {}
}
(funExecutionContextObj = {
variableObject: {
arguments : {
0 : 123,
length : 1
arguments obj
},
x : undefined,
y : 10,
bar : pointer to function bar(),
a : undefined,
foo : undefined
},
scopeChain: { ... },
this: {...}
}
fun.[[Scope]] = [
globalContext.VO
];
执行阶段
fun.Scope = fun.AO + foo.[[Scope]]
(funExecutionContextObj = {
variableObject: {
arguments : {
0 : 123,
length : 1
arguments obj
},
bar : pointer to function bar(),
a : 11,
foo : pointer to function foo(),
},
scopeChain: [
fun.AO
globalContext.VO
],
this: {...}
}
网友评论