简单的概括
箭头函数中的this指向是固定不变的,一直指向定义函数的环境。
使用function定义的普通函数this的指向随着调用环境的变化而变化
详细说一下普通函数this指向问题
普通函数的this指向window
对象的方法中this指向对象本身
构造函数的this指向新创建的对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 普通函数的this指向window -->
<script>
let arr1 = [1, 2]
let arr2 = arr1.splice(0, 1)
function fn1(par1) {
console.log(this, '普通函数的this指向');
}
fn1()
// 对象的方法中this指向对象本身
let obj = {
a: 12,
fn2: function () {
console.log(this, '对象中普通函数this指向')
}
}
obj.fn2()
// 构造函数的this指向新创建的对象
function Fn3() {
this.a = 12
console.log(this, '构造函数this指向')
}
let obj3 = new Fn3()
let obj3_copy = new Fn3()
// 箭头函数的this指向定义时所在的对象
let obj4 = {
a: 12,
fn5: function () {
console.log(this)
}
}
obj4.fn5()
// 改变普通函数的this指向的方法
// 在函数定义时,使用call方法,apply方法,bind方法改变this指向
obj4.fn5.call(window) //call方法
obj4.fn5.apply(window) //apply方法
obj4.fn5.bind(window)() //bind方法
let obj6 = {
a: 12,
fn7: () => {
console.log(this)
}
}
obj6.fn7() //一般的写法
var fn8 = () => {
console.log(this)
}
fn8()
// 使用function定义的函数,this的指向随着调用环境的变化而变化,而箭头函数中的this指向是固定不变的,一直指向定义函数的环境。call apply bind方法无法改变箭头函数的指向
</script>
</body>
</html>