为了账号安全,请及时绑定邮箱和手机立即绑定

js笔记三十八之call方法深入

标签:
JavaScript
// Array.prototype.slice -> function(){}var ary = [12,23,34];
ary.slice()// ary.slice -> ary这个实例通过原型链的查找机制找到Array.prototype上的slice方法// ary.slice() -> 让找到的slice方法执行,在执行slice方法的过程中,才把ary数组进行了截取

call改变this关键字

// Function.prototype.call = function(){};var obj = {name:"lilei"};function fn(){    console.log(this);
}
fn(); // -> windowobj.fn(); // -> Uncaught TypeError: obj.fn is not a functionfn.call(obj) // -> {name: "lilei"}

call方法的作用:
首先我们让原型上的call方法执行,在执行call方法的时候,我们放fn方法中的this变为第一个参数值obj,然后再把fn这个函数执行;

// 重写call方法Function.prototype.myCall = function (context){    // -> myCall方法中的this就是当前要操作和改变其this关键字的那个函数名
    
    // -> 1. 让fn中的this关键字变为context的值 -> obj
    // -> 让this这个函数中的"this关键字"变为context
    
    // this.toString().replace("this","obj")
    
    // -> 2. 让fn方法在执行
    // this()};
fn.myCall(obj); // -> myCall方法中的this是fnsum.myCall(obj) // -> myCall方法中的this是sumfunction sum(){
    
};
function fn1(){console.log(1);}function fn2(){console.log(2);}
fn1.call(fn2)  // -> 1// -> 首先fn1通过原型链机制找到 Function.prototype上的call方法,并且让call方法执行// -> 此时call这个方法中的this就是我们要操作的fn1// -> 在call方法代码执行的过程中首先让 fn1 中的"this关键字"变成 fn2 ,然后在让 fn1 这个方法执行fn1.call.call(fn2) // -> 2// -> fn1.call 首先fn1通过原型链找到Function.prototype上的call方法// -> 然后在让call方法通过原型在找到Function原型上的call// -> (因为call本身的值也是一个函数,所以同样可以找到Function.prototype)// -> 在第二次再找到call的时候让方法执行,方法中的this是 fn1.call// -> 首先让这个方法中的this变为fn2,然后再让fn1.call执行fn1.call.call.call.call.call(fn2)  // -> 2Function.prototype.call(fn1);  // 什么都不输出Function.prototype.call.call.call(fn1);  // -> 1



作者:uplyw
链接:https://www.jianshu.com/p/4e1669fee27d


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消