what's the deference between apply bind call?

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);

就能打印出來了。


以上,有錯但願各位大神斧正。

相關文章
相關標籤/搜索