执行上下文:
当出现js代码时,就出现了执行上下文,或叫做执行上下文环境。一般来说,执行上下文完成以下工作:
1.变量和函数表达式,先声明,与位置无关(也叫做变量声明提升),默认值是undefined,注意是函数表达式;比如
console.log(a);
var a = 10; 输出是undefined,因为不是a is not declared,故说明了a已经定义了(变量声明提升),其真正的语句执行顺序是
var a;
console.log(a);
a = 10
应该是很清晰了。如果把a的值换成函数表达式,同理。
2.this,必然会被指向某个对象;
3.函数声明,声明+赋值,注意这里和函数表达式是有区别的,比如
console.log(a)
function a(){} 输出function a(){},也就是说函数声明的时候直接被函数赋值
4.执行上下文不是一成不变的。执行上下文有始有终,从js的第一行代码开始就开始存在,那么什么时候结束?好问题,这里就牵扯到执行上下文栈的作用了(下节讲)。执行上下文存在的这一段时间不是一成不变的,因为代码要运行,上下文环境就会变化,比如变量赋值、参数赋值等。比如全局执行上下文环境,会有变量赋值;函数中存在的相应的上下文环境会有参数赋值、arguments赋值等。
因此,在执行上下文中,做了这三项工作,这三项工作也构成了执行上下文。也就是说,js代码在运行时需要有一个准备环境,比如变量的声明准备,所以这个环境就被称为了执行上下文环境,是为执行语句做准备工作的。
综合上述4点,执行上下文:在执行代码执行之前,执行上下文所需要的变量都准备好,或被赋值,或被undefied赋值。
当然,这个环境要分多种情况,最常见的是在全局环境下的执行上下文;还有在函数作用域中的执行上下文;还有eval(不推荐使用)