call() , apply() , bind() 方法,
阿新 • • 發佈:2017-08-02
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() 方法,