javascript 编程中,经常使用 this ,那么 this 到底代表哪个对象呢?
首先我们看看 this 使用的意义,使用 this 可以传递上下文对象,避免在定义中将参数实际名称写入,更可以避免在传递过程中造成混乱,所有使用 this 是非常有效的方法。
那么还是让我们看看,this 到底代表哪个对象吧。分以下四种情况:
1、默认状态代表 window对象,如:
function test() {
console.log(this.val);
}
var val=10;
fn();
输出结果:10
显然使用了全局变量,所有 this 代表的对象为 window
2、通过一个对象调用该函数,则 this 代表最后调用它的对象,如:
function test() {
console.log(this.val);
}
var testobj = {
val:10;
fun:test;
}
testobj.fun();
输出结果:10
this 此时代表 testobj 对象,这是引用该函数的对象。
再如
function test() {
console.log(this.val);
}
var testobj = {
val:10;
obj:otherobj;
}
var otherobj = {
val:20;
fun:test;
}
testobj.obj.fun();
输出结果:20
因为 otherobj 是最后调用函数的对象,所以 this 代表 otherobj。
这里需要注意的一点是,如果使用变量将函数传递给变量,则上下文对象无效,如
function test () {
console.log(this.val);
}
var val=5;
var testobj = {
val:10;
fun:test;
}
var varfun=testobj.fun;
varfun();
输出结果:5
由于定义了变量 varfun = testobj.fun 将函数传递给了变量,testobj 就不再是上下文对象了,this 则代表window对象
所以使用的是全局变量。
3、使用bind()、apply()、call()调用时,this代表传入的第一个参数
function test() {
console.log(this.val);
}
var testobj = {
val:10;
}
test.call(testobj);
输出结果:10
如果传入的第一个参数为 null ,则 this 依然代表 window 对象。
function test() {
console.log(this.val);
}
var testobj = {
val:10;
}
var val:20;
test.call(null);
输出结果:20
4、如果函数是一个构造函数,用new创建对象时,this则代表新创建的对象
function test(val) {
this.val=val;
}
var varfun=new test(5);
console.log(varfun.val);
输出结果:5