#this:
this(执行上下文): 【this的指向问题】。
1.在全局作用域:this就是window。
2.在函数内,this是谁,取决于函数的调用方式:
2.1 如果函数是直接调用的,函数内的this就是window
2.2如果函数是以对象的方法调用的(如:xxx.func()),函数内的this就是方法前的对象(前例中的xxx).
[谁调用函数,this就指向谁]
***注意***
1)每个函数都有自己的this指向。所以进入函数后,this随着函数的调用方式变化,this也是变化的。而且this的指向,不取决于定义在哪。
var fullname = "Iron man";
function getName(str) {
console.log(`我就是${this.fullname},${str}`)
}
getName("钢铁侠最cool") // 函数内的this就是window
var p = {
fullname:"Captain America",
getName:function() {
console.log(`I can do this all day --- ${this.fullname}`)
}
}
p.getName(); // this ==> p
var hi = p.getName() //全局定义了一个变量hi,将p对象的属性getName的值给了hi
hi() // this ==> window【不要被误导,这是直接调用】
p.hi = getName;
p.hi("world") //this就是p
3.强行改变this的指向【俗称掰弯this】
1. call是函数对象自己方法; getName.call(this指向的对象,传给getName的第一个参数,传给getName的第二个参数......)
2. getName.apply(this想指向的对象,[传给getName的参数们];
***注意***
调用函数的方法apply与call时,参数是马上执行的。另外apply第二个参数是数组。
3. bind调用时,函数是不会立马执行的,它比较调皮,返回的是一个新函数,新函数的this,就是你刚才bind的对象。
比如说:
var newFunction = getName.bind(this指向的对象);
【新函数内,this就是bind的参数】
// 调用全局的getName,让getName内的this指向p
hello.apply(p,["我是一个数组"])
hello.call(p,"我不是数组")
var newHello = hello.bind(p)
newHello("希望大家喜欢我的博客")
4.构造函数内的this,在new时,构造函数内的this,指向新创建的对象,new前面的那个“实例”。
5.箭头函数,没有自己的this。如果在箭头函数中出现了this,会像父级作用域找this,知道找到为止。