1、相同点:
修改函数运行时this的指向。
如果第一个参数是undefined或者null,this默认指向window
2、区别:
function fun(...argus) {
console.log(this);
console.log(...argus);
}
let person = {
myName: '王五'
}
2.1、apply
需要两个参数:
①:this指向,②函数接收的参数,以数组的形式传入。
改变this指向后原函数会立即执行,临时改变this指向一次
fun.apply(person,[1,2,3,4]);//将this指向person
fun(5,6,7,8,9);//this指向window
//如果第一个参数是undefined或者null,this默认指向window
fun(undefined,[1])
fun(null,[2])


2.2、call
需要两个参数:
①:this指向,②函数接收的参数,以参数列表的形式传入。
改变this指向后原函数会立即执行,临时改变this指向一次
/*两个参数:1、this的指向,2、参数列表*/
fun.call(person, [123], 234, 456)

2.2.1、手写call原理实现
原理:函数,作为对象的属性,由对象调用,可以改变函数的this,这叫隐式绑定。
//手写一下call的原理实现,重在思路
Function.prototype.myCall = function () {
console.log(arguments);//{ '0': { name: '我是小方', age: 18 }, '1': 1, '2': 2, '3': 3 }
let _o = arguments[0];
console.log(this);//this指向fn这个函数
//添加自定义属性,fn
_o.fn = this;
// .slice,从数组中选择元素并返回
const args=[...arguments].slice(1)
//由对象调用
// 把函数绑定在对象的属性上,并由对象调用,进而改变函数的this
_o.fn(args);//我是小方
}
let obj = {
name: "我是小方",
age: 18
}
function fn() {
console.log(this.name);
}
fn.myCall(obj, 1, 2, 3)

2.3、bind
需要两个参数:
①:this指向,②函数接收的参数,以参数列表的形式传入。
改变this指向后原函数不会立即执行,会返回一个永久改变this指向的函数
let bindFun = fun.bind(person,1, 2, 3, 4, 5, 6, 7);
//可以多次调用,不论调用多少次this指向的都是person
bindFun();
bindFun(111,222,333);


2092

被折叠的 条评论
为什么被折叠?



