变量和函数的上下文决定了它们可以访问那些数据,以及它们的行为
每个上下文都有一个关联的变量对象
,而这个上下文中定义的所有变量和函数都在存在于这个变量对象之上
上下文再其所以代码都执行完毕之后会被销毁,包括定义在它上面的所有变量和函数(全局上下文再应用程序退出之前才会被销毁,比如关闭网页或者退出浏览器)
let color = 'blue'
function changeColor() {
if (color === 'blue') {
color = 'red'
} else {
color = 'blue'
}
}
changeColor()
函数的作用域链包含两个对象:一个是他自己的变量对象(就是定义arguments对象的那个),另一个就是全局上下文的变量对象,函数内部值所以可以访问变量对象color,就是因为可以在作用域链找到它
。
let color = 'blue'
function changeColor() {
let anotherColor = 'red'
function addColor() {
let tempColor = anotherColor
console.log(tempColor);
console.log(color);
//在这里可以访问color,anotherColor和tempColor
}
//这里可以访问color和anotherColor,但访问不到tempColor
addColor()
}
//在这里只能访问到color
changeColor()
上面的代码就涉及到3个上下文,全局上下文,changeColor()的局部上下文和addColor()的局部上下文
内部上下文可以用过作用域链访问到外部上下中的一切,但是外部上下文无法访问内部上下中的内核东西,上下文的连接都是线性的,有序的
函数参数被认为是当前上下文中的变量,因此也跟上下文中的其他变量遵循相同的访问规则