javascript中的this指向

this指向的全部情况

概念:

函数所在当前作用域的对象:指函数被调用时所处的执行环境的对象。在JS中,执行环境是由函数被调用时的上下文决定的(特别地,如果一个对象有一个函数a,而这个函数a被赋值给了全局中的一个变量c,则c为一个独立的函数,故c所在的执行环境就是默认的全局(并非继承父函数的执行环境))
注:箭头函数不同于funciton方式定义函数,箭头函数嵌套在另一个函数中时,它将继承最近的非箭头父函数的this

首先,明确一点:this的指向,只会在调用的时候才能确定

1)直接调用,指向全局(this不在函数中)

1
console.log(this)

打印结果

image-20220222175707495

2)this在函数中

this的指向,只会在调用的时候才能确定

如果函数执行时,没有所属对象,this则指向全局windows{}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let a = {
b:1,
c:function (){
//下面这个this,只有在执行的时候才能确定指向谁
console.log(this) //在本程序中,该语句共被执行两次,一次有所属对象,一次没有所属对象
function d(){ //第一种:该函数没有所属对象(该函数并不是一个属性)
console.log(this)
}
d()
}
}
//第二种
a.c(); //通过a调用函数c(c是a的一个属性);a就是c的所属对象

//也是第一种情况
let e = a.c; //e就是一个单纯的函数
e(); //执行e()的时候,e没有所属对象

打印结果

image-20220222181208250

3) 构造器中的 this:指向新对象

1
2
3
4
5
6
7
function a(){
console.log(this);
}
let b = a;

new a() //构造函数通过new调用创建一个实例对象,指向这个实例对象
new b(); //构造函数通过new调用创建一个实例对象,指向这个实例对象

打印结果

image-20220222181756834

4)apply、call能够改变this指向

无参数时或者传入null、undefined,指向window

apply()、call()都是函数的方法:

  • 若apply()、call()无参数时或者传入null、undefined,则指向windows
  • 若apply()、call()有参数时,第一个参数就是apply()、call()函数的调用者函数的作用域
1
2
3
4
5
6
7
8
9
10
function a(){
console.log(this);
}

a();

new a() //使用new构造的时候,也会执行一遍函数

a.apply(a) //改变了函数中的this指向,指向了传入的实参
a.call(a) //改变了函数中的this指向,指向了传入的实参

打印结果

image-20220222183132710

Contents
  1. 1. this指向的全部情况
    1. 1.1. 1)直接调用,指向全局(this不在函数中)
    2. 1.2. 2)this在函数中
    3. 1.3. 3) 构造器中的 this:指向新对象
    4. 1.4. 4)apply、call能够改变this指向
|