call是函数的方法,call可以调用函数
function fun(){
console.log('Hello World');
}
fun.call()
call可以改变函数中this的指向。
function fun() {
console.log(this.name) //this默认指向window
}
let cat = {
name: '喵喵'
}
// call改变this指向,将this指向由window改为cat
fun.call(cat)
let dog = {
name: '旺财',
sayname() {
console.log('我是' + this.name)
}
}
dog.sayname()
// call改变this指向,将this指向由dog改为cat
dog.sayname.call(cat)
传参
let dog = {
name: '旺财',
sayname() {
console.log('我是' + this.name)
},
eat(food1, food2) {
console.log('我喜欢吃' + food1 + food2)
}
}
dog.sayname()
dog.sayname.call(cat)
// 第一次参数为改变的this指向,后面的参数是函数的参数列表
dog.eat.call(cat, '鱼', '肉')
dog.eat.apply(cat, ['鱼', '肉'])
let a=dog.eat.bind(cat, '鱼', '肉') //bind不会调用函数,但是会作为返回值返回函数
console.log(a);
call和apply都可以直接调用函数,传参方式不同;
call和bind传参方式相同,但是call可以调用函数,bind不会调用函数,但是会返回函数。
call可以用来继承父类的方法
function Animal() {
this.eat = function () {
console.log('吃东西')
}
}
// Cat继承Animal的eat方法
function Cat() {
Animal.call(this) //这里的Animal构造函数作为普通函数,将Animal函数中的this指向cat,this.eat,即cat.eat,cat就继承eat方法
}
let cat = new Cat()
cat.eat() //cat就可以调用eat方法
1,call()、apply()、bind() 都是用来重定义 this 这个对象的!
obj.myFun.call(db); //德玛年龄99,将this由obj指向db
obj.myFun.apply(db); //德玛年龄99
obj.myFun.bind(db)(); //德玛年龄99,bind不能调用函数
以上出了bind 方法后面多了个 () 外 ,结果返回都一致!
由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行
2,对比call 、bind 、 apply 传参情况下
obj.myFun.call(db,‘成都’,‘上海’); //德玛 年龄 99 来自 成都去往上海
obj.myFun.apply(db,[‘成都’,‘上海’]); //德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db,‘成都’,‘上海’)(); //德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db)(‘成都’,‘上海’); //德玛 年龄 99 来自 成都,上海去往undefined
call 与 apply 的相同点:
方法的含义是一样的,即方法功能是一样的;
第一个参数的作用是一样的;
call 与 apply 的不同点:两者传入的列表形式不一样
call可以传入多个参数;
apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入
call 、bind 、 apply
这三个函数的第一个参数都是 this 的指向对象;
而第二个参数存在差别:
call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,‘成都’, … ,‘string’ );
apply的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,[‘成都’, …, ‘string’ ]);
bind除了返回是函数以外,它 的参数和call 一样。
当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等