this是函数体内自带的一个对象指针,它始终指向调用对象,但函数被调用时,使用this可以访问调用对象。如果this未包含属性,则传递的是当前对象。下面我们主要通过函数的引用和调用来感受一下this的灵活性。
函数的引用和调用分别表示不同的概念,虽然它们都无法改变函数的定义作用域,但是引用函数,却能够改变函数的执行作用域,而调用函数是不会改变函数的执行作用域的。
例1 函数的引用和调用
var o = { name: "对象o", f: function() { return this; } } o.o1 = { name: "对象o1", me: o.f //引用对象o的方法f }
在上面的例子中,函数中的this指的是的当前执行域对象o1;我们可以将方法me属性值o.f替换成对象o的方法 f后的属性值内容,可以理解为this动态的指向了o1,返回的就是o1;
调用结果:
var who = o.o1.me(); alert(who.name); //返回字符串"对象o1",说明当前this代表对象o1
但是如果我们把对象o1的me属性值改为函数调用:
o.o1 = { name: "对象o1", me: o.f() //调用对象o的方法f }
则this所代表的是定义函数时所在的作用域对象o:
var who = o.o1.me; alert(who.name); //返回字符串“对象o”,说明当前this代表对象o
例2 使用call()和apply()
而call()和apply()方法就可以直接改变被执行函数的作用域,使其作用域指向所传递得参数对象。因此,函数中包含的this关键字也指向参数对象。
function f() { //函数f() alert(this.x + this.y); } var o = { //对象直接量 x: 1, y: 2 } f.call(o); //执行函数f(),返回值为3
使用call()方法执行函数f()时,call会把函数f()的作用域强制修改为参数对象所在的上下文,在上例中即call()方法把函数f()强制转换为对象o的一个方法并执行,这样函数f()中的this就代表对象o,所以this.x的值即为1,this.y的值即为2,结果就返回3。