js this指向

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 语言精髓》

 

posted @ 2017-03-06 11:04  我要成为酷酷的人  阅读(224)  评论(0编辑  收藏  举报