call,apply,bind的用法
call,apply和bind都用来改变js中this对象的指向
var dog = { name:'dog', speak: function(value){ alert("i'm" + name + ", i can " + value); } } var cat = { name:'cat' }
1.call
此时cat中没有我们想用的speak方法,可以用call来‘借用’dog的方法。
dog.speak.call(cat,'meow'); // i'm cat, i can meow
2.apply
apply和call的用法类似,只是后面的传参是数组的格式。这个特性可以让apply在使用时直接传入一个数组对象,使得比call更方便一些
dog.speak.apply(cat,['喵喵喵']); // i'm cat, i can 喵喵喵
3.bind
相比call和apply,bind的兼容性要差一些。不过最大的不同点是,bind返回的是一个函数,可以赋给一个对象,以便于之后调用,而不是直接执行函数。如果要直接生效需要再加一对括号才行。
var cat = {name:'cat'};var dog = { name : 'dog', speak : function(){ setTimeout(function(value){ alert("i'm " + this.name + ", i can " + value ) }.bind(cat,'meow'),1000) } } dog.speak();
// i'm cat, i can meow
可以注意到的一点是,bind可以直接使用在一个函数后面,比起前两位要把要用的对象再写一次要方便一些。
当bind不兼容时如何用call或apply封装一个bind?
function bind(fn,obj){ return function() { return fn.apply(obj,arguments); } }