#this:数组
this(执行上下文): 【this的指向问题,个人看法就是三个字“肇事者”,状况有不少种,可是咱们要拨开迷雾,找到‘凶手’】。 如今你就是没有小兰的柯南,真想只有一个!app
1.在全局做用域:this就是window。
2.在函数内,this是谁,取决于函数的调用方式:
2.1 若是函数是直接调用的,函数内的this就是window
2.2若是函数是以对象的方法调用的(如:xxx.func()),函数内的this就是方法前的对象(前例中的xxx).
[谁调用函数就指向谁,就像是蚊子叮了你,你总要找到那个肇事者]
***注意***
1)每一个函数都有本身的this指向。因此进入函数后,this随着函数的调用方式变化,this也是变化的。并且this的指向,不取决于定义在哪,而是取决于函数是谁调用的。
var fullname = "Iron man";
【喜欢钢铁侠的请你点个赞】
function hello(str) {
console.log(`我就是${this.fullname},${str}`)
}
hello("钢铁侠最cool") //函数内的this就是window
var p = {
fullname:"Captain America",
hello:function() {
console.log(`你好,我叫${this.fullname}`)
}
}
p.hello();
var hi = p.hello() //全局定义了一个变量hi,将p对象的属性hello的值给了hi
hi() //this是window【不要被误导,这是直接调用】
p.hi = hello
p.hi("world") //this就是p
3.强行改变this的指向【俗称掰弯this,难道这说明之前this是直的?】
call是函数对象本身方法
hello.apply(this想指向的对象,[传给hello的参数们])
hello.call(this指向的对象,传给hello的第一个参数,传给hello的第二个参数......)
***注意***
调用函数的方法apply与call时,参数是立刻执行的。另外apply第二个参数是数组。
bind调用时,函数是不会立马执行的,它比较调皮,返回的是一个新函数,新函数的this,就是你刚才bind的对象。
好比说:
var newFunction = hello.bind(this指向的对象);
【新函数内,this就是bind的参数】
//调用全局的hello,让hello内的this指向p
hello.apply(p,["我是一个数组"])
hello.call(p,"我不是数组")
var newHello = hello.bind(p)
newHello("但愿你们喜欢个人博客")
4.构造函数内的this,在new时,构造函数内的this,指向新建立的对象,new前面的那个“帅哥”。
5.箭头函数,没有本身的this。若是在箭头函数中出现了this,会像父级做用域找this,知道找到为止。
(箭头函数就是一个“变种人”,并且不是金刚狼的那种。)
复制代码