面向对象语言中 this 表示当前对象的一个引用。
但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。解析器(浏览器)每次调用函数都会向函数内部传进一个隐含的参数this,this是个参数指向的是一个对象,,这个对象称为函数执行的上下文对象,根据函数的调动方式不同,this指向不同的对象
一般为以下几种情况:
- 在方法中,this 表示该方法所属的对象。以方法形式(对象的方法)调用,this指向调用方法的哪个对象
- 如果单独使用,this 表示全局对象。
- 在函数中,this 表示全局对象。以函数的形式调用,this指向window
- 在函数中,在严格模式下,this 是未定义的(undefined)。
- 在事件中,this 表示接收事件的元素。
- 类似 call() ,apply()和bind() 方法可以将 this 引用到任何对象
- 计时器(setTimeout,setInterval)中的this指向window。
- 还有特殊的用法,在ES6中的箭头函数的this指向问题
箭头函数的this指向
1.箭头函数在哪里定义,this就指向谁
2.也可以说箭头函数没有this
3.箭头函数外的this指向谁,箭头函数this就指向谁
下面用代码演示一下:
(1)不使用严格模式,.直接在script标签中打印this(全局模式下)
<script>
console.log(this);
</script>
输出的是window,说明此处的this指向window
(2).严格模式下,在全局输出this。
"use strict";
console.log(this); //指向window
输出的仍然是window
(3).不使用严格模式,全局函数里面输出this
function a() {
console.log(this);
}
a();
也是指向window。因为全局函数是window对象身上方法
(4).使用严格模式。全局函数内部的this指向是undefined
function a() {
console.log(this);
}
a(); //也是指向window。全局函数是window对象身上方法
this的指向是undefined
(5).对象的this指向
var obj = {
name: "汤姆",
call: function () {
console.log("喵喵!" + this);
},
};
obj.call(); //指向调用者obj
因为call方法是obj这个对象调用的,所以this指向obj
(6)构造函数的this指向
构造函数用于创造对象
function F() {
console.log("构造函数");
console.log(this);
}
var f = new F();
构造函数的this指向 新创建的那个对象 比如上图的f
(7).改变this指向
在一些业务逻辑中,需要我们改变this的指向,想要改变this的指向,幸运的是js为我们提供了3种方法,分别是call,bind,apply方法
<script>
function fun() {
console.log(this);
}
var obj = {
name: '金钱豹'
}
var obj2 = {
name: '金豹'
}
fun.call(obj);
// 当函数调用call()和apply()都会调用函数执行
// 在调用call和apply()都会将一个对象指定为第一个参数
// 这两个函数帮助我们修改对象this,想要是谁就传谁给这两个函数作为形参
fun.apply(obj2);
// 普通调用this指向window
// call方法可以将实参在对象之后依次传递 fun(obj,实参,实参)
// apply()方法需要将实参封装到一个数组 apply(obj,[2,3])
// this情况,以函数形式调用时,this指向window
// 以方法形式调用时,this是调用方法的对象
// 以构造函数的形式调用时,this是新创建的那个对象
// 使用call和apply调用时,this是指定的那个对象
</script>
上述代码fun.call(obj)将原来this指向是window,改为指向obj
fun.apply(obj2)将原来this指向是window,改为指向obj
当函数调用call()和apply()都会调用函数执行,在调用call和apply()都会将一个对象指定为第一个参数
这两个函数帮助我们修改对象this,想要是谁就传谁给这两个函数作为形参
有时候我们改变this指向的同时,还要传实参。
call方法可以将实参在对象之后依次传递 fun(obj,实参,实参)
apply()方法需要将实参封装到一个数组 apply(obj,[2,3])
再次总结以下this指向:
1. this情况,以函数形式调用时,this指向window
2.以方法形式调用时,this是调用方法的对象
3. 以构造函数的形式调用时,this是新创建的那个对象
4.使用call和apply调用时,this是指定的那个对象