希望解答的问题:
- 为什么
call
方法不能通过apply
的方式去调用? - 第二和第三次输出为什么是
-Infinity
? -
Reflect
对象为什么只提供了apply
方法而没有call方法?
不知道是不是我的理解不对,总之这个问题还是困扰了我挺久,希望有大神能帮我解答。
希望解答的问题:
call
方法不能通过apply
的方式去调用?-Infinity
?Reflect
对象为什么只提供了apply
方法而没有call方法?不知道是不是我的理解不对,总之这个问题还是困扰了我挺久,希望有大神能帮我解答。
你需要搞清楚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
}
这两个方法都是非继承的方法。
谢邀~可以看看这两篇文章,再回过头来看自己的问题,应该能解答你的疑惑。
JS魔法堂:再次认识Function.prototype.call
面试官问:能否模拟实现JS的call和apply方法
8 回答4.6k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
这种用法本身就是错的,
call
和apply
的第一个参数是调用目标函数时传给它的this
,你这样用是把要调用的函数当成this
传给call
或apply
,所以是错的,只是恰好第一种方式支持了这种调用方法而已。