1. 程式人生 > >call() , apply() , bind() 方法,

call() , apply() , bind() 方法,

say script apply log prot pro style fun 高級程序設計

  先來說說call() 和 apply()方法:

  在《javascript高級程序設計》中有提到:函數也是對象,函數原型鏈的頂層實際上是指向Object的。既然函數是對象,那麽自然就具有屬性和方法。“ 每個函數都包含兩個非繼承而來的方法 call() , apply() ”

  call() , apply() , 這兩個方法其本質就是設置函數體內this對象指向的值,換個說法來理解這句話,一個對象可以通過call() 和 apply() 來調用其他對象的方法。比如說對象A擁有一個 sayName的方法,但是對象B沒有這個方法,正常來說,我們就不能在對象B調用sayName方法,如果我們又不想為對象B定義一個sayName方法,這是就可以使用call() , apply()

對象不需要和方法有任何的耦合關系!

function Person() {};
Person.prototype = {
   name: ‘Jersey‘,
   sayName:function() {
        console.log(this.name);
    }    
} 
var person1 = new Person();
person.sayName();  //           Jersey

var car = {
   name: ‘Car‘;  
}
car.sayName();     //  wrong!
person1.sayName.call(car);    //
Car person1.sayName.apply(car); //Car //這時函數sayName裏的this指向car window.color = ‘red‘; var o ={color: ‘biue‘} function say() { console.log(this.color); // red 全局環境中this指向window } say.call(this); //red 設置say函數內的this指向這個this say.call(window); //red 設置say函數內的this指向window say.call(o); //
biue 設置say函數內的this指向對象o , 這是say函數的執行環境就改變了

call() 和 apply() 方法的作用相同,他們區別僅在於接收參數的方式不同。(這裏就不多說了)

bind() 方法:

  使用bind()方法會創建一個函數的實例(因為函數是對象嘛),這個函數實例的this值會被綁定到傳入bind()方法的第一個參數上

window.color = ‘red‘;
var o = {color: ‘blue‘};
function say() {
    console.log(this.color);    //red
}
var sayColor = say.bind(o);    //首先創建了一個函數的實例,把原say函數的this值綁定到對象o上,在把這個函數實例保存到變量sayColor裏
sayColor();    //blue     

使用call() 和 apply()方法會立即執行調用這兩個方法的函數,使用bind()方法,會創建一個函數實例,在調用這個函數實例的時候才執行

其實要理解這三個方法最重要的就是理解函數對象,就把函數想象成普通的對象,然後call() apply() bind() 作為這個對象的方法去改變這個函數內部的一些東西

call() , apply() , bind() 方法,