对this指向的理解

174 阅读2分钟

一,什么是this指向?

1.在js中,this的意思为“这个;当前”,是一个指针型变量,它动态指向当前函数的运行环境。

2.在不同的场景中调用同一个函数,this的指向也可能会发生变化,但是它永远指向其所在函数的真实调用者;如果没有调用者,就指向全局对象window。

二,this的使用场景

1.全局使用

在浏览器全局环境下,this 始终指向全局对象(window), 无论是否严格模式

this===window  // true

普通函数 非严格模式下,指向window严格模式下,指向 undefined

function f() {
    console.log(this === window);
}
f() // true

function f() {
    'use strict';
    console.log(this === undefined);
}
f() // true

2. 对象方法中

    var obj ={ 
        foo: function () { 
            console.log(this); 
            } 
        }; 
    obj.foo() // obj
    

上面代码中,obj.foo方法执行时,它内部的this指向obj

   var a = {
      p: "Hello",
      m: function () {
        console.log(this.p);
      },
    };
    console.log(a.m()); // Hello
        

上面代码中,a.m方法执行时,它内部的this指向a,所以执行this.p的时候就相当于执行a.p

   var a = {
      p: "Hello",
      b: {
        m: function () {
          console.log(this.p);
        },
      },
    };
    console.log(a.b.m()); // undefined
        

m方法中的this指向指的不是a,而是a.b,所以a.p是拿不到的,只可以拿到a.b.p

var b = {
      m: function () {
        console.log(this.p);
      },
    };

var a = {
    p: "Hello",
    b: b,
  };

 a.b.m(); // 等同于 b.m()

3.构造函数中使用

构造函数中的this,指的是实例对象。

var Obj = function (p) {
    this.p = p; 
};

var o = new Obj('Hello World!');
o.p // "Hello World!"

上面代码定义了一个构造函数Obj。由于this指向实例对象,所以在构造函数内部定义this.p,就相当于定义实例对象有一个p属性。

4.DOM事件处理函数

事件处理函数内部的 this 指向触发这个事件的对象

    var Box = document.getElementById('box'); 
    oBox.onclick = function () { 
        console.log(this) //Box 
    }
    

5. 箭头函数中的 this

箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值。

    function Person() { 
        setInterval(() => { 
            console.log(this) //Person 
        }, 3000); 
    } 
    var p = new Person();

以上 this 指向 Person

    var a = () => {
        console.log(this);
    };
    a();
    

image.png

上面代码定义了一个方法,由于箭头函数不绑定this,所以指向了window