执行环境
执行环境:函数的运行环境
js的全局执行环境:window对象=》活动对象
1、每个函数都有一个执行环境,在函数执行时被创建,每个执行环境中包含一个变量对象(活动对象),执行环境中定义的所有变量和函数都保存在这个对象中。
2、函数执行时,函数的执行环境被创建后推入执行栈中,执行环境包含的活动对象被放入函数的作用域链中,
3、函数执行完毕,函数的执行环境被推出执行栈,执行环境被销毁。函数作用域链中对应的活动对象也被销毁。
作用域链:
每个函数都有一个自己的作用域链,它的作用域链决定了哪些数据能被函数访问。
1、当一个函数创建后,它实际上定义和保存一个作用域链,这个作用域链是函数定义的时候创建的。
函数创建时的作用域链中包含的是一个全局对象(所有的全局变量和函数)。
2、函数执行时,会向作用域链中推入执行环境中的活动对象(即在函数内部定义的变量和函数以及参数集合)。
函数执行时,作用域链的前端始终都是当前执行的代码所在环境的变量对象。作用域链的末端始终都是全局执行环境的变量对象。
3、当函数执行完毕后,函数作用域链中对应的活动对象也被销毁。
闭包:
function outer(){
var sky="blue";
function inner(){
console.log(sky);
}
return inner;
}
var result=outer();
result(); //"blue"
闭包是指有权访问另一个函数作用域中的变量的函数。
1、所谓闭包,就是在函数outer内部定义了一个内部函数inner(inner可以访问函数outer的内部变量),并将inner函数return出去,使得外部环境可以通过inner访问outer的内部变量。
2、每个函数都有自己的执行环境和作用域链,当一个函数被执行时,它的执行环境就会被推入js的执行栈,其活动对象加入自己的作用域链中,一旦函数执行完,执行栈将其执行环境弹出,函数作用域链中的活动对象被销毁。
3、形成闭包的原因:函数outer执行完毕后,由于函数outer的内部函数inner被return出去后赋值给了一个全局变量,存在于全局作用域链的活动变量中,而inner又需要访问函数outer的内部变量。因此,函数outer作用域链中的活动对象没有被销毁(正常情况下,函数outer执行完毕后,其活动对象是应该被销毁的)。
网友评论