apply bind call
這三個方法,做用都是改變當前使用該方法的對象的this指向。
但三個方法仍是有一些區別,先說說共同點。app
window.person = { name: 'mice', age: '22' } var another = { name: 'henry', age: '23' } function say() { alert(this.name +'',+ this.age + '歲'); }
這個時候的this指向window,因此執行彈出的就是mice,22歲。與say.call(window)效果同樣。函數
say.call(another); 或者 say.apply(another); 或者 say.bind(another)();
執行以後this的指向就變成了another。彈出的就是henry,23歲。
值得注意的是,call和apply都是改變上下文中的this並當即執行這個函數,bind方法改變了指向以後會返回一個函數,能夠隨時調用。call和apply做用徹底同樣,只是傳參的方式不同。ui
傳參方式:
call(thisObj,arg1,arg2...)
apply(thisObj,[obj1,obj2...])
bind(thisObj,arg1,arg2...)this
知道了三者的區別,那麼簡單說下這三個方法的實際做用。
好比prototype
function fruits(){}; fruits.prototype = { color: 'red', say: function(){ console.log('My color is ' + this.color); } } var apple = new fruits(); apple.say();
此時會打印出My color is red
可是如今咱們有另外一個對象bananacode
banana = { color: 'yellow' }
咱們須要調用apple裏的say方法,可是咱們不想從新定義,
因此咱們可改變apple的指向對象
apple.say.call(banana);
此時會打印出My color is yellowit
再好比io
var a = { user: 'wgf', fn: function(){ console.log(this.user); } } var b = a.fn; b();
此時打印出來的是undefined
由於此時this指向的是b,b沒有user的屬性
因此此時改成console
b.call(a);
就能打印出來了。
以上,有錯但願各位大神斧正。