function fn1() {
console.log(1)
}
function fn2() {
console.log(2)
}
fn1.call(fn2); //输出1
fn1.call.call(fn2);//输出2,不是很明白,求解释
function fn1() {
console.log(1)
}
function fn2() {
console.log(2)
}
fn1.call(fn2); //输出1
fn1.call.call(fn2);//输出2,不是很明白,求解释
你这里没有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()
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
fn1.call.call(fn2)最终执行的方法是fn1.call,实际上就是Function.prototype.call这个方法,只不过多了一个call绑定后,这个方法执行过程中的this指向了fn2。而call方法执行的过程就是相当于执行this(),于是最终变成了执行fn2方法了。