(一)执行上下文
可以理解成,执行JavaScript代码的一种环境。(个人理解为任何事情的发生都是在一定环境下发生的,执行js代码也是一样,必然是在某种环境下进行。)
上下文分为以下3类:
1)全局执行上下文:指的是浏览器中的全局对象window对象,只有这一个。
在严格模式下,this值为undifined,非严格模式下,this值即为window对象。
执行代码时,最先执行全局执行上下文终的代码。
2)函数执行上下文:指当调用函数时创建的函数执行上下文环境。
多个函数调用会产生多个函数执行上下文。
3)eval执行上下文:执行eval函数会创建执行上下文。只不过严格模式执行eval函数,不会作用于它的
外层作用域。
(二)执行上下文栈
可以理解成执行上下文栈是一个由js引擎创建的存储函数调用的栈结构,遵循 先进后出的原则。(用来管理执行上下文)
1)执行全局代码之前,将全局上下文压入栈底。
2)开始执行全局代码,如果有调用函数情况,依次创建函数执行上下文,并执行压栈操作。执行函数。如果函数执行完毕,则将函数上下文pop出栈,并等待垃圾回收,然后往下执行代码。
3)等全部代码执行完毕,栈中只剩下全局执行上下文。他会等到浏览器关闭时出栈。
(三)作用域
es5中:1)全局作用域
//最外层函数(全局函数)和在最外层函数外面定义的变量(声明一个变量)拥有全局作用域
// 所有末定义直接赋值的变量自动声明为拥有全局作用域
//所有window对象的属性拥有全局作用域
2)函数作用域。
//函数内部声明的变量只有在函数内部可以访问,全局作用域和上一层的函数作用域无法访问。
es6中:块级作用域。
//通过let和const来实现,声明的变量,其作用域都是块级。
(四)作用域链
作用:用于查找某个变量。
函数中查找某个变量,如果当前作用域没有,就到其上一次作用域找,找到即返回,没有继续往上找,直到找到全局作用域,找到就返回,没有就报错。
var a = 1
function fun1(a){
a = 3
console.log(a) //3
function fun2(a){
console.log(a) //3
console.log(b) //报错
}
fun2(a)
}
fun1(a)
console.log(a) //正常为1,因为前面报错没打印