关于this的指向有两点判断原则:
- 当函数被直接调用时this指向全局对象(window)。
- 当函数被当作某个对象的方法来调用时(即通过“.”或“[]”来调用时),this指向该对象(调用方法的对象)。
总结起来就是一句话:
永远指向其所在函数的所有者。如果没有所有者时,指向window。此外,可以通过call和apply来强制改变this(new运算的过程中包含call)。
实例分析当函数被直接调用时this指向全局对象(window)。
var x=1;
function fn(){
alert(this.x);
}
fn();//返回1,this指向window
var x=1;
(function(){
function fn(){
alert(this.x);
}
fn();//返回1,this指向window
})();
var x=1;
var obj={x:2,method:fn};
function fn(){
alert(this.x);//返回2,this指向obj
return function(){
alert(this.x);//返回1,this指向window
}();
}
obj.method();
当函数被当作某个对象的方法来调用时(即通过“.”或“[]”来调用时),this指向该对象(调用方法的对象)。
var obj={x:2,method:fn};
function fn(){
alert(this.x);
}
obj.method();//返回2,this指向obj
var obj={x:2,method:fn};
function fn(){
alert(this.x);//返回2,this指向obj
var newObj={x:3};
newObj.re=function(){
alert(this.x);//返回3,this指向newObj
}
newObj.re();
}
obj.method();
var box=document.getElementById("box");
box.οnclick=function(){
alert(this);//返回[object HTMLDivElement]
}
可以通过call和apply来强制改变this。
var x=1;
var obj={x:2,method:fn};
function fn(){
alert(this.x);//返回2,this指向obj
}
obj.method.call(window);//返回1
obj.method.call();//返回1,当call中没有参数时表示为全局对象window
var x=1;
var obj={x:2,method:fn};
function fn(){
alert(this.x);
}
fn();//返回1,this指向window
fn.call(obj);//返回2,this指向obj