JS中this的四种调用模式主要分为方法调用模式、函数调用模式、构造器调用模式和(apply、call、bind)调用模式。
第一种:方法调用模式 (也就是用.调用的)this就是这个对象本身
当一个函数被保存为对象的一个属性时,我们称它为一个方法,当一个方法被调用时,this被绑定到该对象,如果一个调用表达式包含一个属性表达式(即一个.点表达式或者[subscript]下标表达式)那么它被当做一个方法调用。
var myObject = { value:0; increment:function(inc){ this.value + = typeof inc === 'number'?inc:1; } } myObject.increment(); document.writeln(myObject.value);//1 myObject.increment(2); document.writen(myObject.value;)
方法可以使用this去访问对象,所以它能从对象中取得或修改该对象,this到对象的绑定发生在调用它的时候,这个超级“迟绑定”(very later binding)使用函数可以对this高度复用,通过this可取得它们所属对象的上下文的方法称为公共方法。
第二种:函数调用模式
当函数并非一个对象的属性时,那么它被当做一个函数来调用:
var sum = add(3,4);
当函数以些模式调用时,this被绑定到全局对象,这是语言设计上的一个错误,如果语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this对象,这个错误设计的后果就是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权,有一个很容易的解决办法如果该方法定义一个变量并给它赋值为this,那么内部函数就可以通过这个变量来访问到this。
//给myObject增加一个double方法 myObject.double = function(){ that = this; var helper = function(){ that.value = add(that.value,that.value); } helper();以函数的形式来调用helper } //以方法的形式来调用double myObject.double(); document.wtiten(myObject.getValue());//6
第三种:构造函数调用模式
var Class = function(){ this.value = 100; } var class = new Class(); console.log(class.value); //100
我们通过new关键字来调用构造函数,此时this会绑定在该新对象上(也就是这个实例对象上)
第四种:apply和call以及bind的调用模式:指定绑定对象
var myObject = {value:100}; var foo = function(){ console.log(this); }; foo(); //global foo.apply(myObject);//{value:100} foo.call(myObject);//{value:100} var newFoo = foo.bind(myObject); newFoo(); //{value:100}
apply()方法接受两个参数第一个是函数运行时的作用域,另一个是参数的数组(arguments)
call()方法第一个参数与apply是一样的,第二个参数需要一个个列举出来
call方法更接近我们平时调用函数,而apply需要我们传递 Array形式的数组做为参数,它们是可以相互转换的。
评论1