call,apply和bind有什么区别?
面试中,面试官也会经常问call,apply和bind的区别,那么我们应该如何回答呢?
答:call和apply用来指定函数的上下文。比如fn.call(obj)或者fn.apply(obj)此时fn将以obj作为上下文(this)运行。call和apply的区别体现在参数的传递上,比如fn需要接受参数a,b,c。
此时两者的语法不同:
fn.call(obj , a , b, c,d,m,e);
fn.apply(obj , [a,b,c,e,f]);
此时,可以回答:call如果需要传递第二个参数的时候,需要的是散值,而apply需要传递第二个参数时候,第二个参数要是数组,这就是它们的区别,在工作中,经常会利用apply“传递数组能够将数组变为零散参数”的特性,巧妙应用它,比如做数组的最大值:Math.max.apply(null , arr); 轻松计算arr的最大值。
但是现在ES6中有了…解构的运算符,此时可以用Math.max(…arr)轻松计算了。
最后,bind()也是用来终身绑定一个函数的上下文,此时这个函数无论用何种方法调用,上下文一定是这个绑定的上下文。当然,箭头函数也非常常用,箭头函数生来就固定了上下文,call和apply是无效的。