总结:执行上下文与作用域链
一、执行上下文类型:
1、全局上下文
一直存在,直到页签关闭或者浏览器关闭。
2、函数上下文
存在函数执行期间。
3、特殊上下文:eval执行时上下文
二、作用域
● 全局作用域
● 函数作用域
● 块级作用域
● 动态作用域(call,apply等修改this指向)
1、【作用域】规定了变量的作用范围;
2、【作用域】最大的作用是隔离变量;
3、不同【作用域】下的同名变量不会冲突;
三、上下文与作用域的区别
● 执行上下文指当前JavaScript代码被【解析】和【执行】时所在的环境。
● 【作用域】规定了变量的作用范围。
● 【执行上下文】和【作用域】是两个不同的概念。
● JavaScript的执行分为【解释】和【执行】两个阶段,【作用域】是【解释】阶段确定的,而【上下文】是【执行】阶段创建的。
● 在一个上下文环境里,存在各种各种的【作用域】,它们在上下文里规定了【变量】的【作用范围】。
四、作用域链
● 每种上下文都有其【作用域链】
● 【作用域链】的【顶端】是该执行上下文的【变量对象】,下一级是其【包含函数上下文】(外层函数)的变量对象,依次类推,直到全局上下文的变量对象。每条作用域链的【底端】都是全局上下文的变量对象。
● 在【当前上下文】查找变量,先从作用域链的【顶端】开始查找,找不到就接着往下一级找,直到全局上下文的变量对象。如果遍历结束仍未找到变量,则报错:变量未定义。