Function.prototype.myCall=function myCall(obj,...ary){
// this指向调用myCall的函数 =》fn.myCall(obj,...ary) =》 myCall中的this指向fn函数
obj.fn=this;
// 将this挂到obj的属性上,然后使用obj.fn(...ary)执行fn1(fn就是外面的fn1),
// 这样函数执行其中的this就指向了obj了,然后将我们传进来的参数传进fn即可
//apply其实原理也差不多,只不过传进来的是一个数组,myApply(obj,ary),然后我们执行的时候...ary使用展开运算符就行了
obj.fn(...ary)
}
function fn1(x,y){
console.log(this);
console.log(...arguments);
}
let obj1={name:'等待'};
fn1.myCall(obj1, 10, 20);
如果不明白this为什么会变成obj,可以参考:this的几种情况:https://blog.csdn.net/qq_40959677/article/details/93505757
/**
* bind预储存原理以及高阶js思想:柯理化函数思想
* bind方法执行,会形成一个不销毁的作用域,同时在作用域中记录下bind方法执行时传进来的参数信息,且bind方法中的
* this就是预执行函数,也需要记录下来,然后返回一个小函数给外面的引用,所以bind方法执行的时候并没有执行bind前
* 面.前面的方法,只是记录下来了,当达到某些条件时触发bind留在外面的引用执行的时候,会将之前bind预存储时存储的
* 方法进行执行,将参数传进去,使用call或者apple改变一下this指向,考虑到如果是事件行为的预存储,会传入ev事件
* 对象所有在返回的小函数中要接受其参数,然后一并传给预执行函数执行
* 这种预处理思想就是柯理化函数思想,将后面需要用到的东西提前进行保存(闭包保存),然后在后期进行调用
*/
Function.prototype.myBind=function myBind(context,...ary){
//this => 预执行方法
//context => 预执行方法中的this指向
//ary => 预执行方法参数集合,第一个参数是改变this指向的对象
let _that=this; //this就是预执行函数,需要记录下来供返回函数使用
return function (...innerArg){
//返回一个匿名函数,这样调用myBind预存储的时候就会形成一个不销毁的作用域
_that.apply(context,ary.concat(innerArg));
}
}
function fn3(x,y){
console.log(...arguments);
}
let obj3={name:'等待'};
document.body.onclick=fn3.myBind(obj3,10,20);