Call、 apply 区别,原生实现 bind Call、apply、bind都是改变this指向的,其中call的话是通过第一个参数来 改变this指向,函数在传参的时候一个一个进行传参,apply也是通过第一个参 数改变this指向,函数传参的时候通过数组或是一组的形式进行传参,而且他 只能用于函数的调用时候,而bind呢不能用于函数的标准调用传参,只能是事 件或是方法的后边进行改变this的指向
他们都是用来改变this指向的。
call:改变this指向 函数被执行了
call(上下文环境,参数)
上下文环境:就是我们想到call的对象
第二个是用来传参数 的 我们同事也要在上面的函数上面来接收 然后返回的就是 我们传递过去的参数。
var msg="今天吃了个鸡腿";
var obj={
msg:"今天有点儿不开心"
}
function getData(data){
//在这里 我们接收传递过来的参数后 赋值给msg返回回来的时候 也是可以的
this.msg=data;
return this.msg
}
//如果我们不用call的话 他就会默认找到window
//第一个是我们要改变的对象,第二个是我么要传递的参数
var data=getData.call(obj,"哈哈");
console.log(data);//结果返回的是“哈哈”
// 全局调用的话我们的this指向等于window
// 我们如何能让我们this指向当前这个函数
// 我们需要用到call 想上面这样 可以改变this指向
apply :
和call相似度很高!!! 有一点注意的是 我们要用数组来进行传参
var msg="今天吃了个鸡腿";
var obj={
msg:"今天有点儿不开心"
}
function getData(data){
this.msg=data;
return this.msg
}
var data=getData.apply(obj,["哈哈"]);
console.log(data);
// 我们在使用apply时候报错了
// 告诉我们要创建一个类数组,只需要给我们传递过去的数据 用数组括起来皆可以啦
特点也同上!!改变了this指向 也能函数 执行
bind :
能改变this指向但是:
bind时候 后台给我们返回了一个函数,但是这个函数并未执行
ƒ getData(data){
this.msg=data;
return this.msg
}
在reach中我们通常用bind来改变 this指向。
如何让函数被执行 只需要在后面加一个小括号
要用两个小括号 来 调用
var msg="今天吃了个鸡腿";
var obj={
msg:"今天有点儿不开心"
}
function getData(data){
this.msg=data;
return this.msg
}
//在这里面我们 用一个小括号 来实现函数的执行
//这一 bind也不能用数组传参 是 逗号的方式传参
var data=getData.bind(obj,"哈哈")();
console.log(data);