call, apply, bind

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容