call、apply、bind的区别
- 三者都可以改变函数的this对象的指向。
- call和apply改变this,会让函数立刻执行;而bind 改变this,不会让函数立刻执行。
- 第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window
- 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入。
// 应用场景:伪数组借用数组方法 NodeList/arguments
function fn() {
console.log(arguments);
// 要往arguments集合中追加一个数100;
// arguments.push(100);
// Array.prototype.push.call(arguments, 100)
// 往arguments集合中追加多个值,[100,200,300]
// Array.prototype.push.apply(arguments)
fn(3, 4, 5, 6);
//call与apply最大的不同点:在于第二个参数,call第二个参数是一个一个的数据,apply第二个参数是数组。
bind 是返回绑定this之后的函数,便于稍后调用;apply 、call 则是立即执行
function add (a, b) {
return a + b;
}
function sub (a, b) {
return a - b;
}
add.bind(sub, 5, 3); // 这时,并不会返回 8
add.bind(sub, 5, 3)(); // 调用后,返回 8