let obj = {
nickName: "ace",
say(a, b, c) {
console.log('hi,i am ' + this.nickName);
console.log(a,b,c);
}
}
let zz = {
nickName: 'simba'
}
obj.say.call(zz, 10, 20, 30)
obj.say.apply(zz, [10, 20, 30])
let newfn = obj.say.bind(zz, 10, 20, 30)
newfn()
//obj.say.bind(zz, 10, 20, 30)()
定义了两个对象为obj和zz
以上为三种方法调用来于比较call、apply、bind的差别 虽然三个执行结果都一样但还是有差别的
执行obj.say()的时候结果为
call
当执行 obj.say.call(zz, 10, 20, 30)时,call方法里有两个参数,第一个参数为this所指向的对象,这里的对象为zz,第二个参数就是根据实参所传进去的值,有几个值就传几个值。
apply
执行obj.say.apply(zz, [10, 20, 30])时,apply方法里也有两个参数,第一个参数还是this所指向的对象,也为zz,第二个参数就跟call有差别了,apply的第二个参数必须放到一个数组里面传过去,是一个整体。
bind
bind和前两者不同的地方是,bind返回的是一个修改过this的函数或方法,如果想要执行它,就得再调用一下这个修改过this的函数,否则就不会执行,可以直接在后边加一个括号,或者用一个新的变量来接收。它的参数和call的参数一样。
- obj.say.bind(zz, 10, 20, 30)()
- let newfn = obj.say.bind(zz, 10, 20, 30)
newfn()
总结
- 相同点:三个方法第一个参数都是this想要指向的对象,想要指向谁,第一个参数里就把谁放进去
- 不同点:
1.apply里面的第二个参数为数组是一个整体,其余两个就是等个数的值
2.bind的作用是返回一个修改过this指向的函数或方法,不会执行,如果想要执行就得再调用它就行。