javascript中的this是根据程序的上下文环境变化的,可以分为以下两种情况:
1.如果this所在的函数是直接被调用的,则this指向的是该函数所在上下文的对象。
2.如果this所在的函数是一个对象中的函数,则this指向的是拥有该函数的对象。以下举例说明:
假设有一js函数,其使用了一个this.num变量
var num= 1;
function testThis()
{
alert(this.num);
}
1.直接调用testThis()
//this指向的是调用该函数的上下文中的对象,则this.num指向的是调用该函数的上下文中的num
2.将testThis赋值给一个变量后再调用
var myTestThis = testThis;
myTestThis();//this指向的和直接调用testThis()一样,都为该函数所在上下文的对象。
3.将testThis赋值给一个对象的属性
var myObj = {};
myObj.num = 2;
myObj.myTestThis = testThis;
myObj.myTestThis ();//由于myTestThis是myObj对象的一个属性,则this指向的是拥有myTestThis属性的对象myObj
//则this.num表示的是myObj.num
理解了以上三个例子,再看看是否可以理解下面两个例子:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
function() func2 {
return this.name;
};
return func2;
}
};
alert(object.getNameFunc()());//注意调用该函数后面一定是两个括号()()
这里涉及到了一个javascript中的一个概念:‘闭包’,简单来说闭包就是在一个函数内部调用另一个函数,该函数内部的函数中又使用了外层函数中的变量,对于这个object.getNameFunc()()函数调用来说,getNameFunc就是一个闭包,他的内部没有定义变量,所以this指向的是全局空间中的name变量,也即'The Window'。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
这里,getNameFunc依旧是一个闭包,不同的是在getNameFunc内部,他引用了this变量,类似于上面例子3,此时的this指向的是拥有getNameFunc方法的对象object,that = this,则that指向的也即object,that.name即'My Object'。
最后,关于js中的闭包可以参考这个网址:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
本文的最后两个例子就是从这篇文章中摘过来的。