JavaScript的this指针的指向
在浏览器的环境下,全局函数中,this 等于window,而当函数被作为某个对象的方法调用时,this 等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this 对象通常指向window。
console.log(this == window); //true
var name = "window";
var object1 = {
name: "object1",
getName: function(){
return this.name;
}
};
console.log(object1.getName()); // object1
var object2 = {
name: "object2",
getName: function(){
return function(){
// 因为返回值是一个匿名函数,匿名函数中的this是window
return this.name;
}
}
};
console.log(object2.getName()()); // window
解决办法
要想在对象的方法中使用this对象,可以如下这么写
var object3 = {
name: "object3",
getName: function(){
var that = this; // 此时的this还是指向这个对象
return function(){
return that.name;
}
}
};
console.log(object3.getName()()); // object3
更神奇的写法
var name = "window";
var object = {
name: "object",
getName: function(){
return this.name;
}
};
console.log(object.getName);
console.log(object.getName()); // object
console.log((object.getName)()); // object
console.log((object.getName = object.getName)()); // window
在这里getName是一个函数指针(引用C++的说话),指向的是一个函数,那么把getName打印出来是什么呢?
ƒ (){
return this.name;
}
是一个函数体,而且是匿名函数,所以最后一个console,把object.getName这个匿名函数赋值给object.getName时,this的指向变了,this现在指向window,所以输出的是window。上述写法和下面的写法是一个效果。
var name = "window";
var object = {
name: "object",
};
// 直接用匿名函数
object.getName = function(){
// 这里的this就是window
return this.name;
}
console.log(object.getName);
console.log(object.getName()); // object
console.log((object.getName)()); // object
console.log((object.getName = object.getName)()); // window