this对象
this引用的是函数据以执行的环境对象,即当前函数的所有者对象(执行空间),取值有两种可能
- 当在网页的全局作用域中调用函数时,this 对象引用的就是 window,无论有多少层函数调用
function a(){
function b(){
function c(){
console.log(this)
}
c()
}
b()
}
a() //window
所有者对象是函数,但所有者对象外层是对象,this指向仍然是window
var a = 'global';
var obj = {
a : 'local',
test : function(){
function test1(){
alert(this.a);
}
test1(); //global
}
};
obj.test();
- 当函数执行空间是对象时,this指向此对象
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //"red"
o.sayColor = sayColor;
o.sayColor(); //"blue"
[[scoep]]和作用域链
在创建函数时,会创建一个预先包含当前执行环境(即所创建函数的所有者执行环境)所有变量对象的作用域链,这个作用域链被保存在内部的[[Scope]]属性中。
在调用函数时,会为函数创建一个运行上下文对象,运行上下文定义了函数的执行环境,然后通过复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链。此后,将函数的所有局部变量、命名参数、参数集合以及this构建为一个对象,称为活动对象,并被推入执行环境作用域链的前端
如果在此函数中有定义新的函数,那此函数的执行环境的作用域链就会保存到新函数的[[Scope]]属性中,重复以上操作
当函数执行完毕后,运行上下文就被销毁,如无内部函数作用域的引用,活动对象也会一起被销毁
补充资料:
【Javascript】深入理解javascript作用域与作用域链
【Javascript】深入理解this作用域问题