函数对象方法
-
call()、apply()这个两个都是函数对象的方法、需要通过函数对象调用
-
当对函数调用call()和apply()、都会调用函数执行
/* call()和apply()是函数对象的两个方法 */ function fun(){ console.log('我是fun函数'); } /* 正常调用 */ fun() //我是fun函数 /* 使用apply和call调用 */ fun.call() //我是fun函数 fun.apply() //我是fun函数
函数的this指向
-
以函数形式调用时、this永远都是window
-
以方法的形式调用时、this是调用方法的对象
function fun(){ console.log(this); } fun() //this=>指向window let obj = {} function fun1(){ console.log(this); //this=>指向Objct } fun1.call(obj) //this指向obj fun1.apply(obj) this指向obj
-
在调用call()、apply()可以将一个对象指定为第一个参数。此时这个对象将会成为函数执行时的this.
/* 原本函数的指向永远都是window对象 1、使用了call、apply。把里面的this指向改为obj 2、所以此时的fun函数的this指向obj */ function fun(name,age){ console.log(name); //zjf console.log(age); //18 //现在的感觉就像是函数多了一个对象 // 其实就是把原来指向window的this // 指向了那个对象 console.log(this.name); //obj_name this.say() //obj_name 让我看康 } let obj = { name:'obj_name', say(){ console.log(this.name,'让我看康'); } } // 函数对象.call方法(对象||this它指向谁this就指向谁、后面跟参数) fun.call(obj,'zjf',11)
构造函数的this指向
-
以构造函数的形式调用、this就是新创建的那个对象
// 构造函数中的this function Person(name,age){ this.name = name this.age = age } /* 在obj对象里面有一个say方法 使用的是this.name+‘字符’ */ let obj = { name:'obj_name', say:function(){ console.log(this.name+'是say()方法'); } } /* 使用new语句实例化一个对象 此时p是构造函数实例化出来的一个对象 而这个apply(对象),你写一个对象它的this指向就是指向的那个 */ let p = new Person('zjf',18) /* 现在的this指向的就是、构造函数中的this. */ obj.say.apply(p)//zjf是say()方法 obj.say.call(p)//zjf是say()方法
// 构造函数中的this
function Person(name,age){
this.name = name
this.age = age
obj.say.apply(this)
}
/*
在obj对象里面有一个say方法
使用的是this.name+‘字符’
*/
let obj = {
name:'obj_name',
say:function(){
console.log(this.name+'是say()方法');
}
}
// obj.say()
/* 使用new语句实例化一个对象
此时p是构造函数实例化出来的一个对象
而这个apply(对象),你写一个对象它的this指向就是指向的那个
*/
let p = new Person('zjf',18)
//zjf是say()方法
总结:
- call和apply都是为了改变this的指向问题、在第一个参数里写那个对象、他们的this就指向谁、作用都一样。
- call的传参方式是直接写写在后面就可以了、但是apply只接受一个参数数组
- bind和其他两个方法作用也是一致的,只是该方法会返回一个函数。