call & apply

  对于apply和call二者在做用上是相同的:这两个方法一般被用来类的继承和回调函数。但二者在参数上有区别的。call函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。web

如 func.call(func1,var1,var2,var3) 对应的apply写法为:func.apply(func1,[var1,var2,var3])ajax

 
  call和apply 方法能够用来代替另外一个对象调用一个方法。其实就是更改对象的内部指针,即改变对象的this指向的内容。若是没有提供 第一个 参数,那么 Global 对象被用做第一个。
除了call和apply,bind也能够实现改变this指向的内容。
add.call(sub,4,2)就至关于 add(4,2)

注:在ES5的strict模式下,this已经被规定不会指向全局对象,而是undefinedapp

 

一、第一个参数函数

(1)this

   

(2)spa

  function Obj(){prototype

       this.value="对象!";3d

  }
  var value="global 变量";指针

  function Fun1(){对象

       alert(this.value);

  }
    window.Fun1();    //global 变量
    Fun1.call(window);   //global 变量
    Fun1.call(document.getElementById('myText'));   //input text
    Fun1.call(new Obj());    //对象!

 

二、第二个参数

  (注:sayColor()也是做为全局函数定义的,并且当在全局做用域中调用它时,它确实会显示”red”——由于对this.color 的求值会转换成window.color 的求值。而sayColor.call(this)和sayColor.call(window),则是两种显式地在全局做用域中调用函数的方式,结果固然都会显示”red”。可是,当运行sayColor.call(o)时,函数的执行环境就不同了,由于此时函数体内的this 对象指向了o,因而结果显示的是”blue”。使用call()(或apply())来扩充做用域的最大好处,就是对象不须要与方法有任何耦合关系。)

 

做用1: 类的继承

function Person(name,age){

     this.name = name;

     this.age=age;

     this.alertName = function(){

             alert(this.name);

         }

      this.alertAge = function(){

             alert(this.age);

         }

}

function webDever(name,age,sex){

         Person.call(this,name,age);    //继承Person

         this.sex=sex;

         this.alertSex = function(){

                  alert(this.sex);

         }

}

var test= new webDever(“愚人码头”,28,”男”);

test.alertName();//愚人码头

test.alertAge();//28

test.alertSex();//男

注:Person.call(this,name,age) 的意思就是使用 Person构造函数(也是函数)在this对象下执行,那么 webDever就有了Person的全部属性和方法,test对象就可以直接调用Person的方法以及属性了。

 

做用2: 回调函数
  call 和 apply在回调行数中也很是有用,不少时候咱们在开发过程当中须要对改变回调函数的执行上下文,最经常使用的好比ajax或者定时什么的,通常状况下,Ajax都是全局的,也就是window对象下的,来看这个例子:

function Album(id, title, owner_id) {

  this.id = id;

  this.name = title;

  this.owner_id = owner_id;

};

Album.prototype.get_owner = function (callback) {

  var self = this;

  $.get(‘/owners/’ + this.owner_id, function (data) {

       callback && callback.call(self, data.name);   //这里使用self,由于当callback做为普通函数调用时,this指向的是window。

  });

};

var album = new Album(1, ‘生活’, 2);

album.get_owner(function (owner) {

     alert(‘The album’ + this.name + ‘ belongs to ‘ + owner);

});

 
这里

album.get_owner(function (owner) {

     alert(‘The album’ + this.name + ‘ belongs to ‘ + owner);

});

中的 this.name就能直接取到album对象中的name属性了。
相关文章
相关标签/搜索