执行上下文
简介:执行上下文是JavaScript中是一个重要的概念。变量或函数的上下文决定了他们可以访问到那些数据,以及决定变量或函数的行为。每个上下文都会关联一个变量对象,此上下文定义的所有变量和函数都会存在这个对象上。
全局上下文
在浏览器中,全局上下文通常指的就是window
对象。因此通过var定义的全局变量和函数都会成为window
对象的属性和方法。上下文在所有代码执行完之后会被销毁,包括变量对象上的属性和函数。全局上下文在应用程序结束前会被销毁,关闭网页或者退出浏览器
函数上下文
每个函数也会关联一个变量对象,就是说每个函数都有自己的上下文。执行函数时,函数关联的变量对象就会被推送到上下文栈。函数执行完之后,上下文栈就会弹出该函数的上下文,将控制权交还给之前执行的上下文。
作用域
在执行上下文的时候,会创建变量对象的一个作用域链
。作用域链决定了各级上下文中代码可以访问的的变量和函数的顺序。
正在执行的上下文的变量对象始终位于作用域链的最前端,执行函数上下文时,函数的变量对象就是其活动对象。活动对象最初只有一个变量 arguments
。全局上下文没有这个变量。
代码事例
var name = '张三';
function fn1 () {
let age = 18;
console.log(name);
function fn2 () {
let fav = '打豆豆':
console.log(age);
// 可以访问:fav age name
}
fn2();
// 可以访问:age name
}
fn1();
// 只能访问:name
内部上下文可以通过作用域链访问上下文中的一切,但是外部上下文无法访问内部上下文任何东西。换句话说就是:上下文之间的连接是线性的、有序的。每个上下文都可以到上一级上下文中搜索变量和函数,但是任何上下文都不能到下一级上下文中搜索。
注意:函数的上下文被认为是当前上下文的变量,因此也跟上下文中其他变量遵循相同的访问规则