前言
信任许多小伙伴们都被this 的指向问题所折磨过,this 它究竟指向哪啊? 今天咱们就来聊聊怎样判别this 指向哪里,一盏茶的功夫让小伙伴们高兴一整天!
文中所实例代码都运行在Chrome浏览器的Console控制台中。
在上篇文章中,咱们讲了三种this指针的绑定规则,接下来咱们讲讲剩余的两种办法,并拓展一下。
this 的绑定规则
- new 绑定
在以前讲结构函数的文章里,咱们讲了new
关键字的作用,感兴趣的小伙伴们能够去我的主页中看看那篇文章。咱们知道,自定义结构函数中,通常运用this为实例目标增加特点和办法,如以下比如:
function Car(color) {
this.name = 'BMW'
this.height = '1400'
this.lang = '4900'
this.weight = 1000
this.color = color
}
let car1 = new Car('pink') // 实例目标
let car2 = new Car('green')
那此刻结构函数中的this指向谁呢?咱们来输出一下:
很明显,咱们的实例目标中呈现了各种的特点,所以,结构函数中的this指向new出来的实例目标自身,这个比如中this
别离指向car1
和car2
.
5. 显现绑定 — call, apply, bind
显现绑定是咱们经过call
,apply
,bind
,改动this的指向,咱们一起来看看比如:
function foo() {
console.log(this.a);
}
var obj = {
a: 2
}
foo()
假如这样调用foo(),那么便是this默许绑定,this指向全局,那么输出undefined
,那么咱们怎样让this指向obj,输出2呢?
1. call
function foo() {
console.log(this.a);
}
var obj = {
a: 2
}
foo.call(obj)
call的作用便是强行把foo中的this指向obj,咱们来输出以下来看看:
假如foo(x, y)中有参数传入,那咱们运用call时应该怎样样呢?
function foo(n, m) {
console.log(this.a, n, m); // 2 100 200
}
var obj = {
a: 2
}
foo.call(obj, 100, 200)
2. apply apply办法跟call办法差不多,但是传入参数时需求运用数组来装
function foo(n, m) {
console.log(this.a, n, m); // 2 100 200
}
var obj = {
a: 2
}
foo.apply(obj, [100, 200])
咱们来输出一下:
能够看出,apply
和call
办法都将this的指向改动了
3. bind
bind的履行成果会回来一个函数体,所以咱们需求这样写:
function foo(n, m) {
console.log(this.a); // 2 100 200
}
var obj = {
a: 2
}
var bar = foo.bind(obj)
bar()
假如咱们想传入参数:
这儿咱们举个比如,传入的参数为100和200
var bar = foo.bind(obj, 100, 200)
bar()
// 或许
var bar = foo.bind(obj)
bar(100, 200)
箭头函数
箭头函数没有this这个概念,写在箭头函数中的this也是它外层函数的this
首要咱们来看一个比如:
var obj = {
name: 'TOM',
show: function() {
var bar = function() {
console.log(this.name);
}
bar()
}
}
obj.show()
这儿bar中的this指向哪呢?因为bar()是直接调用,this的默许绑定规则,那么它指向的是全局,这儿就输出undefined
假如咱们这儿运用的箭头函数的话:
var obj = {
name: 'TOM',
show: function() {
var bar = () => {
console.log(this.name);
}
bar()
}
}
obj.show()
箭头函数里是没有this的, 假如在箭头函数中写了this,那么this就相当于它的外层函数上面,是它外围函数的this。
上述例题中,因为bar是箭头函数,那么bar
内的this
就相当于在它的外层函数show
上,
那么obj.show()就触发了隐式绑定规则,this
指向obj,this.name输出TOM
总结
this
- this的绑定规则
-
默许绑定 — 函数在哪个词法作用域里生效,this就指向哪里
-
隐式绑定 — 当函数被一个目标所拥有,再调用时,此刻this回指向该目标
-
隐式丢失 — 当函数被多个目标链式调用时,this指向引证函数的目标
-
显现绑定 — call, apply, bind
-
new 绑定
箭头函数
箭头函数没有this这个概念,写在箭头函数中的this也是它外层函数的this
今天的内容就到这啦,假如你觉得小编写的还不错的话,或许对你有所启发,请给小编一个辛苦的赞吧