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

有没有人遇到过这个问题哈!关于js call原理问题?谢谢哈~

有没有人遇到过这个问题哈!关于js call原理问题?谢谢哈~

慕雪6442864 2019-08-17 09:32:27
functionfn1(){console.log(1);}functionfn2(){console.log(2);}**fn1.call(fn2);//输出1fn1.call.call(fn2);//输出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通过原型找到call方法call方法也是函数在通过原型找到call方法并让call执行将fn1.call中的关键字改为fn2并让fn1.call执行此时为什么就变为fn2执行了?
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

开始我也没有理解在写个过程中逐渐理解了你可以先模拟一下call,尝试使用call2来解释
Function.prototype.call2=function(context,...args){
context=context||window;
context.fn=this;
constresult=context.fn(...args);
deletecontext.fn;
returnresult;
};
第一个,第二个都是按照你的方式输出。模拟是成功的。我们来看第二个
fn1.call2===fn1.call2.call2//true
则其实是
fn1.call2===fn1.call2.call2===Function.prototype.call2
其实调用方式为Function.prototype.call2.call2(fn2)至于为什么会被实质上是当前fn2被当作this指向了call。和fn1一点关系也没有
最后发现实际写的call2一点用没有,发上去权当测试。
                            
查看完整回答
反对 回复 2019-08-17
?
ibeautiful

TA贡献1993条经验 获得超5个赞

你说的很接近,但是应该是从原型链拿到了Function.prototype.call的引用,而不是fn1.call
所以这个问题会变成(Function.prototype.call).call(fn2)
这样应该就比较好理解Function.prototype.call(thisArg)
Function.prototype.call调用传入第一个需要充当this的函数
我们把fn2稍微改一下
functionfn2(test){console.log('fn2:'+test);console.log(this)}
此时fn1.call.call(fn2)
会输出fn2:undefined以及window对象
是因为我们call(fn2)===call(fn2,void666,void666)
稍微改动一下
fn1.call.call(fn2,{},'fn2testcase')会输出fn2:fn2testcase以及{}
                            
查看完整回答
反对 回复 2019-08-17
  • 2 回答
  • 0 关注
  • 321 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信