call, apply, bind区别
call
var obj = {name:'iceman'};
function fn() {
console.log(this);
console.log(this.name);
}
fn(); // this --> window
// obj.fn(); // Uncaught TypeError: obj.fn is not a function
fn.call(obj); // this --> obj
首先寻找
call
方法,最后通过原型链在Function
的原型中找到call
方法,然后让call
方法执行,在执行call
方法的时候,让fn
方法中的this
变为第一个参数值obj
,最后再把fn
这个函数执行。
apply
var obj = {name:'iceman'};
function fn(num1, num2) {
console.log(num1 + num2);
console.log(this);
}
fn.call(obj , 100 , 200); // 300, this --> obj
fn.apply(obj , [100, 200]); // 300, this --> obj
call在给fn传递参数的时候,是一个个的传递值的,而apply不是一个个传的,而是把要给fn传递的参数值同一个的放在一个数组中进行操作,也相当于一个个的给fn的形参赋值。
bind
var obj = {name:'iceman'};
function fn(num1, num2) {
console.log(num1 + num2);
console.log(this);
}
let b = fn.bind(obj, 100, 200); //不执行,this指向已经改变,有一个改变后的返回值
b(); //300, this --> obj