js的call函数?

function fn1() {
    console.log(1)
}
function fn2() {
    console.log(2)
}
fn1.call(fn2); //输出1
fn1.call.call(fn2);//输出2,不是很明白,求解释
阅读 2.8k
3 个回答

fn1.call.call(fn2)最终执行的方法是fn1.call,实际上就是Function.prototype.call这个方法,只不过多了一个call绑定后,这个方法执行过程中的this指向了fn2。而call方法执行的过程就是相当于执行this(),于是最终变成了执行fn2方法了。

你这里没有this,看不到效果,改一下
function fn1() {
    console.log(this.a)
}
function fn2() {
    console.log(this.b)
}
fn1.call(fn2); 
//此时执行call上下文是fn1,然后执行上下文(即是fn1)并绑定执行时的上下文是fn2,此时fn1中的this.a打印出来是undefined,因为fn2并没有a属性
fn1.call.call(fn2);
//同样,第一个call有一个执行他的上下文(原本是fn1),但是后面的call把这个上下文改为了fn2,因此执行上下文(此时即是fn2),并把第二个call的第二个参数作为执行fn2的上下文
//因此fn1.call.call(fn2,{b:2})(这里假设有个参数)  
等价于 <=>
fn2.call({b:2})//结果为2,如果没有{b:2}那就为undefined
新手上路,请多包涵

原型链很重要,这几天在学习,自己的想法。

前提,通过原型链得知,call 是一个内部定义的 Function 对象。
f1.call 和 f2.call 都为 Function.prototype.call,
f1.call === f2.call
f1.call === Function.prototype.call

执行f1.call.call(f2),相当于执行了f2调用f1.call,
即f2调用Function.prototype.call(),相当于f2调用自己得call函数,即f2.call()。
由于f2.call()传入了空,this为全局global,最后执行为windows.f2()

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题