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

就能打印出来了。


以上,有错但愿各位大神斧正。

相关文章
相关标签/搜索