js中call,apply,bind的实现原理()

// js中call,apply,bind的实现原理()
// 三者的区别,都是改变this指针,call和apply主要是参数区别,bind返回的是一个函数体,而call和apply是立即执行
// call的实现
function fn1 (str1,str2,str3){
console.log(this,str1,str2,str3);
}
function fn2(){

}
Function.prototype.call = function (context){
    // 避免传入的是基本类型,使用object进行对象化
    context = context ? Object(context) : window;
    context.fn = this;
    let args = [];
    for (let i = 1;i<arguments.length;i++) {
        args.push('arguments[' + i + ']');
    }
    // es数组的结构
    let r = eval("context.fn("+args + ")");
    delete context.fn;
    return r;
}
fn1.call('hellow',1,2,3);

// apply的实现原理
Function.prototype.apply = function (context,args){
// 避免传入的是基本类型,使用object进行对象化
context = context ? Object(context) : window;
context.fn = this;
if (args) {
return eval("context.fn("+args + ")");
}
let argss = [];
for (let i = 1;i<arguments.length;i++) {
argss.push('arguments[' + i + ']');
}
// es数组的结构
let r = eval("context.fn("+args + ")");
delete context.fn;
return r;
}
fn1.apply('hellow',[1,2,3]);
//bin的实现的话,改变函数不要立即执行就可以

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。