关于JS中的call和apply方法

clipboard.png

希望解答的问题:

  • 为什么call方法不能通过apply的方式去调用?
  • 第二和第三次输出为什么是-Infinity
  • Reflect对象为什么只提供了apply方法而没有call方法?

不知道是不是我的理解不对,总之这个问题还是困扰了我挺久,希望有大神能帮我解答。

阅读 2.2k
3 个回答

这种用法本身就是错的,callapply的第一个参数是调用目标函数时传给它的this,你这样用是把要调用的函数当成this传给callapply,所以是错的,只是恰好第一种方式支持了这种调用方法而已。

你需要搞清楚call()apply()的作用以及区别,两者都是改变this对象的指向.比如:

var obj = {
   name:"abcd"
}
function fn1(){
    console.log(this.name);//undefined
}
function fn2(){
   fn1.call(obj,null);
   console.log(this.name);//abcd
}

call替换成apply也是一样的结果。两者的区别就是,传递的参数,第一个参数都是要改变指向的对象,第二个参数则不同,call传递一个数组项参数,apply传递一个数组参数,也可以是函数的arguments对象。如:

var obj2 = {
    name:'abcd',
    sex:'xx'
}

function fn1(name,sex){
  return name + sex;
}
function fn2(){
   return fn1.apply(obj2,['hhh','male']);//hhhmale
}

这两个方法都是非继承的方法。

推荐问题
宣传栏