面试题准备(四):作用域、作用域链

作用域

执行期上下文:变量对象 VO、作用域链 Scope、this
作用域 :[[scope]] 存储执行期上下文集合,函数创建时,就会保存所有父变量到其中
作用域链:[[scope]] 中的执行期上下文集合呈链式连接,这种连接称为作用域链

function fun1() {
	function fun2() {}
}

// 函数创建时 分析以上两个函数的作用域
fun1.[[scope]] = {
	GO
}
fun2.[[scope]] = {
	fun1.AO
	GO
}

// 函数激活时 将活动对象 AO 加入作用域链最顶端 作用域链创建完毕
fun2.Scope = {
	AO
	[[scope]] = {
		func1.AO
		GO
	}
}

分析

var scope = "global scope"
function checkscope(){
    var scope2 = 'local scope'
    return scope2
}
checkscope()

// 1. 函数创建时 保存作用域链到 [[scope]]
checkscope.[[scope]] = {
	GO: {
		scope: 'global scope'
	}
}
// 2. 函数执行
// 1) 创建 checkscope 的执行期上下文然后压入执行期上下文栈
ECStack = {
	checkscope.context
	global.context
}
// 2) 复制 [[scope]] 属性创建作用域链
checkscope.context = {
	checkscope.[[scope]]: {
		GO
	}
}
// 3) 创建 AO
// AO 创建过程 1.创建AO 2.变量声明 3.形参实参相统一 4.函数体赋值
checkscope.context = {
	AO = {
		arguments: {
			length: 0
		},
		scope2: undefined
	},
	checkscope.[[scope]]: {
		GO
	}
}
// 4) 函数顺序执行
checkscope.context = {
	AO = {
		arguments: {
			length: 0
		},
		scope2: 'local scope'
	},
	checkscope.[[scope]]: {
		GO
	}
}
// 5) 函数执行完返回 scope2, checkscope 函数的执行期上下文出栈销毁
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值