JS中,this的值取决于调用的模式,而JS中总有4中调用模式:
1.方法调用模式:
当一个函数被保存为对象的一个属性时,我们称它为一个方法,当一个当法被调用时,this指向改对象,如:
var obj = { value : 1, getValue : function(){ alert(this.value); } }; obj.getValue(); //输出1,此时的this指向obj
注意: 该模式下,this到对象的绑定发生在方法被调用的时候。
2.函数调用模式:
当一个函数并非一个对象的属性时,它被当作一个函数来调用,此时this指向全局对象(window),如:
window.value = 1; function getValue (){ alert(this.value); }; getValue(); //输出1,此时的this指向window
3.构造器调用模式:
结合new前缀调用的函数被称为构造器函数,此时的this指向该构造器函数的实例对象,如:
function show(val){ this.value = val; }; show.prototype.getVal = function(){ alert(this.value); }; var func = new show(1); func.getVal(); // 输出1 alert(func.value) //输出1
// 从上面的结果,可以看出,此时的this指向了func对象
4.apply/call 调用模式
apply 和 call 方法可以让我们设定调用者中的this指向谁,如:
var fun = function(str){ this.status = str; } fun.prototype.getStatus = function(){ alert(this.status); } var obj = { status : "loading" }; fun.prototype.getStatus.apply(obj); //输出”loading“ ,此时getStatus方法中的this指向了obj
补充说明:
call方法:
语法:call( [ thisObj [ , arg1 [ , arg2 [ , [ , .argN] ] ] ] ] )
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变成由thisObj指定的新对象。
如果没有提供thisObj参数,那么Global对象被用作thisObj。
apply方法:
语法:apply( [ thisObj [ , argArray ] ] )
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果argArray不是一个有效的数组或者不是arguments对象,那么将导致一个TypeError
如果没有提供argArray 和 thisObj 任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数
取自 : 《JavaScript 语言精髓》