一、定义:this是运行时当前的指代。在不同处,指向也不同。
二、构造函数中的this:用于给类添加成员。 function Person(name, age) { this.name = name this.age = age this.sayHis = function() { console.log(`大家好!,我叫${this.name},今年${this.age}岁`);}} 扩展:创建对象,该对象会拥有,类型中定义的所有成员。 let p1 = new Person('张三',20) console.log(p1);
三、对象中的this:在方法中,this指向方法的调用者,谁在调用该方法,this就指向谁 如果一个方法,不是由对象调用执行的,而是直接执行的,那么该方法里面的this就执行window对象 let obj1 = { name: '肖战', age: 20, sayHi: function() { console.log(`大家好!,我叫${this.name},今年${this.age}岁`);}} obj1.sayHi()
四、箭头函数中的this:在箭头函数中没有this,如果在箭头函数中使用了this,它会向上一层函数中去找this; 如果上一层函数也是箭头函数,或者没有上一层函数了,这个时候this就指向window对象。 let obj1 = { name: '肖战',age: 20, sayHi: function() { console.log(`大家好!,我叫${this.name},今年${this.age}岁`);}sayHello:()=>{ console.log(`Hello!我是${this.name},今年${this.age}岁`);}} let obj2={name: '关晓彤',age:22} obj2.sayHi=obj1.sayHi obj2.sayHi ( ) 补: var 定义的成员,会自动添加为window对象的成员
五、更改this的指向 let obj1 = { name: '李现', age: 30, sayHi() { console.log(`大家好!,我叫${this.name},今年${this.age}岁`);}} let obj2 = {name: '彭于晏',age: 32} 1、call :有参数 obj1.sayHi.call(obj2,a,b) ;无参数 则去除a,b 2、apply : 有参数 obj1.sayHi.apply(obj2,[a,b]) 只能有两个参数,用中括号。无参数 则去除a,b 3、bind: obj1.sayHi.bind(obj2,a,b)() 返回的是新的方法,需要加个括号,去执行一下