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);
就能打印出来了。
以上,有错但愿各位大神斧正。