JavaScript入门总结第五弹——带你搞懂this

2019-07-25 14:09:48 浏览数 (1)

Hello,小可爱们我又来了!今天的主题是一个非常困惑人的专题,this,想要弄清this的指向,也是一件不容易的事情。下面我们就开始正题了~~

this

1

this是什么

不同于其它面向对象语言this只表示当前对象的引用,在JavaScript中,this的指向不是固定不变的,而是会随着执行环境而改变的。

比如:this 可以表示方法所属对象;this 可以表示全局对象;this 可以是未定义的(undefined);this 可以表示接收事件的元素;this 也可以引用到任何对象。

2

方法所属对象

在对象方法中,当函数作为某个对象的方法调用时,this指向调用方法的对象;如果将函数值赋给某变量且没有立即执行的时候,this的值就要根据函数执行时所在环境进行判断,如下例子,rabbit1的执行环境就是全局

var color = "yellow"

var rabbit = { color: "white",

tail: "short",

style : function() { return this.color " " this.tail;

}

};

rabbit.style()//white short

var rabbit1 = rabbit.style

rabbit1()//yellow short

3

全局对象

全局作用域或者普通函数中this指向全局对象window

console.log(this)//window

function myRabbit () {

console.log(this)

}

myRabbit()//window

4

未定义的(undefined)

严格模式下函数没有绑定到this上,这时候this是undefined

"use strict";

function myRabbit() { console.log(this);

}

5

接收事件

在绑定HTML元素事件时,this指向接收事件的HTML元素

<button onclick="alert('Meo')">Click me</button>

6

对象绑定

call,apply

通过call或apply可以改变函数的调用对象,从而改变this的指向。this会绑定到call或apply的第一个参数上,不传参数,则绑定至全局。

这里call和apply作用相同,但是有一点点区别,那就是call的第二个及后续参数是一个参数列表,apply的第二个是一个数组,参数列表和参数数组都将作为函数的参数进行执行。

var x = 1;

var obj = {

x:2

}

function myRabbit() { console.log(this.x);

}

myRabbit.call(obj) //2

myRabbit.apply(obj) //2

myRabbit.call() //1

myRabbit.apply(null) //1

myRabbit.call(undefined) //1

bind

bind 方法会创建一个新函数,新函数的 this 会永久的指向 bind 传入的第一个参数。call, apply也不能改变。

var x = 1;

var obj = {

x:2

}

function myRabbit() { console.log(this.x);

}

var a = myRabbit.bind(obj)

myRabbit() //1

a() //2

7

构造函数调用

使用 new 关键字,通过构造函数生成一个实例对象。此时,this 便指向这个新对象。当构造函数返回对象时,this指向返回对象,如果返回非引用类型,则仍然指向实例话的新对象。

var x = 1;

function myRabbit() { this.x = 2;

}

var a = new myRabbit()

console.log(a.x) //2

8

箭头函数

ES6 新增的箭头函数不仅更加整洁,还对 this 的指向进行了改进。箭头函数会从作用域链的上一层继承 this。如下例子,obj.y()运行时,调用的对象是obj,this指向obj,y中的箭头函数继承y中的this,结果为2.将y赋值给a,y中的this指向全局对象,得到1。ps:call和apply也不能改变this的指向

var x = 1;

var obj = {

x: 2,

y:function(){

var myRabbit = () => {

console.log(this.x)

}

return myRabbit()

}

}

obj.y() //2

var a = obj.y

a() //1

好了,今天的内容就到此为止了,不知道小伙伴们有没有搞懂this的指向呢,喜欢兔妞的文章就请点击好看让更多人看到吧~~么么哒!

0 人点赞