function fn1(){console.log(1);}
function fn2(){console.log(2);}
**fn1.call(fn2);//输出1
fn1.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执行了 ?
开始我也没有理解 在写个过程中逐渐理解了
你可以先模拟一下 call,尝试使用call2来解释
第一个,第二个都是按照你的方式输出。模拟是成功的。
我们来看第二个
则其实是
其实调用方式为 Function.prototype.call2.call2(fn2)
至于为什么会被实质上是 当前 fn2 被当作this 指向了call。和fn1 一点关系也没有
最后发现实际写的 call2 一点用没有,发上去权当测试。