this对象表示当前环境的上下文,在以下场景中this指向有所不同。

    1、普通函数内的this
    普通函数内部的this对象指向window

    1. function test() {
    2. this.a = 1;
    3. console.log(this); // window
    4. }
    5. test();
    1. var a = 1;
    2. function test() {
    3. console.log(this); // window
    4. console.log(this.a); // 1,相当于 window.a
    5. }
    6. test();
    1. function test(a) {
    2. this.a = a;
    3. console.log(this); // window
    4. return this;
    5. }
    6. console.log(test(1).a); // 1,相当于 window.a

    严格模式下,函数内的thisundefind

    1. var a = 1;
    2. function test() {
    3. "use strict";
    4. console.log(this); // undefind
    5. console.log(this.a); // error
    6. }
    7. test();

    2、对象方法内的this指向对象本身

    1. var obj = {
    2. a: 1,
    3. test: function () {
    4. console.log(this); // obj
    5. },
    6. };
    7. obj.test();

    3、实例化构造函数的时候this指向实例化对象

    1. function Test(a) {
    2. this.a = a;
    3. console.log(this); // 实例化对象 {a: 1}
    4. }
    5. new Test(1)

    实例化对象调用构造函数原型方法的时候this仍然指向实例化对象

    1. function Test(a) {
    2. this.a = a;
    3. }
    4. Test.prototype.say = function () {
    5. console.log(this.a); // 1,this 指向实例化对象
    6. };
    7. var test = new Test(1);
    8. test.say();

    4、事件处理程序中的this指向DOM本身

    1. var oBtn = document.getElementById("btn");
    2. oBtn.onclick = function () {
    3. console.log(this); // this 指向 button
    4. };

    5、定时器中的this指向window

    1. var oBtn = document.getElementById("btn");
    2. oBtn.onclick = function () {
    3. console.log(this); // this 指向 button
    4. var _this = this;
    5. setTimeout(function () {
    6. console.log(this); // setTimeout 内的 this 指向 window
    7. console.log(_this); // this 指向 button
    8. }, 1000);
    9. };

    6、模块化中的this

    1. var initModule = (function () {
    2. return {
    3. a: 1,
    4. b: 2,
    5. plus: function () {
    6. return this.a + this.b;
    7. },
    8. };
    9. })();
    10. console.log(initModule); // {a: 1, b: 2, plus: fn}
    11. console.log(initModule.plus()); // 3

    7、闭包中的this也指向window

    1. function test() {
    2. console.log(this); // window
    3. return function test1() {
    4. console.log(this); // window
    5. };
    6. }
    7. var test3 = test()
    8. test3()

    8、其余情况下,谁调用方法,则this就指向谁。

    1. function Test(a) {
    2. this.a = a;
    3. }
    4. Test.prototype = {
    5. a: 2,
    6. say: function () {
    7. console.log(this.a);
    8. }
    9. }
    10. var test = new Test(1);
    11. test.say(); // 1,实例化调用的时候,this 指向实例化对象
    12. Test.prototype.say(); // 2,函数原型直接调用的时候 this 指向 prototype(也可以理解为对象方法内的 this 指向对象本身)

    综合案例:

    1. (function () {
    2. function Test(a, b) {
    3. this.oBtn = document.getElementById("btn");
    4. this.a = a;
    5. this.b = b;
    6. }
    7. Test.prototype = {
    8. init: function () {
    9. // this 指向实例化对象
    10. this.bindEvent();
    11. },
    12. bindEvent: function () {
    13. // 事件处理程序中的 this 指向 DOM,所以需要改变 this 指向
    14. this.oBtn.onclick = this.plus.bind(this);
    15. },
    16. plus: function () {
    17. // this 指向实例化对象
    18. console.log(this.a + this.b);
    19. },
    20. };
    21. window.Test = Test;
    22. })();
    23. var test = new Test(1, 2).init();