一道call()
函数的面试题
call()
函数能改变this指针的指向,能方便的为对象扩展方法,在实际项目中属于重度应用的方法。
下面来看题目:
function fn1() {console.log(1);}
function fn2() {console.log(2);}
fn1.call(fn2);
fn1.call.call(fn2);
fn1.call.call.call.call(fn2);
fn2.call();
Function.prototype.call(fn2);
Function.prototype.call.call.call(fn2);
Function.prototype.call.call.call(fn1);
//Array.prototype.call([1,2,3]); // 所以这样调用会报 TypeError 错误,Array.prototype.call is not a function
-
fn1.call(fn2);
这样的调用方式大家应该比较熟悉。call()
函数的第一个参数应该是对象,fn2
是函数,在Js中函数的本质也是对象;所以就是在fn2对象上调用fn1方法(注意fn2上本来是没有fn1这个方法的,调用call时会给fn2临时添加一个属性,它的值就是fn1方法的地址),等同的效果就是直接执行fn1()
; -
fn2.call();
call()
可以不传参,这时候默认的