JavaScript - this指向问题(建议收藏反复查看)

Posted WHOVENLY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript - this指向问题(建议收藏反复查看)相关的知识,希望对你有一定的参考价值。

今天认真研究了一下关于javascript中this指向的问题,总结了以下规律,希望能对this指向不明白的同学一点帮助。

1.在全局环境下

this 始终指向全局对象(window), 无论是否严格模式。

console.log(this.document == document); //true
console.log(this === window); //true
this.a = 37;
console.log(window.a); //37
console.log(this)//window

2.普通函数直接调用

  • 非严格模式下 指向window
  • 严格模式下,为undefined
//非严格模式
function fun1() {
  console.log(this); //window
}
fun1();
//严格模式
function fun2() {
  "use strict";
  console.log(this); //undefined
}
fun2();

3.对象函数调用

哪个对象调用 ,则该函数最外层this就指向哪个对象。

var obj = {
   fn: function () {
   console.log(this)
   }
}
obj.fn()//obj
let obj1 = {
  a: 222,
  fn: function () {
    console.log(this.a);
  },
};
let obj2 = {
  a: 111,
  b: 333,
  fn: function () {
    console.log(this.a);
    console.log(this.b);
  },
};
obj1.fn = obj2.fn;
obj1.fn(); //222  undefined

4.构造函数的调用

构造函数的this指向新创建的那个函数,即自己。

let fun1 = function () {
  this.name = "111";
};
let fun2 = new fun1();
console.log(fun2.name); //111
let fun3 = function () {
  this.name = '111'
}
let fun4 = new fun3();
fun4.name = 'cn';
console.log(fun4.name)//cn

注意点:在构造函数里面返回一个对象,会直接返回这个对象,而不是执行构造函数后创建的对象

let fun5 = function () {
  this.name = 'huanan'
  this.age = 10;
  return { name: '111' }
}
var fun6 = new fun5()
console.log(fun6.name)//111
console.log(fun6.age)//undefined
let fun7 = function () {
  this.name = "huanan";
  this.age = 10;
  return 111;
};
var fun8 = new fun7();
console.log(fun8.name); //huanan
console.log(fun8.age); //10

5.箭头函数

箭头函数没有this,箭头函数的this永远指向自己外面的一层。如果上一层是箭头函数,则再向外寻找一层。

obj3 = {
  fn: function () {
    console.log(this); //obj1
    setTimeout(() => {
      console.log(this); //obj1
    });
  },
};
obj3.fn();
let obj4 = {
  fn: () => {
    console.log(this); //window
    setTimeout(() => {
      console.log(this); //window
    });
  },
};
obj4.fn();

以上是关于JavaScript - this指向问题(建议收藏反复查看)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中this指向问题

JavaScript原型对象this指向问题

JavaScript中的this指向问题

JavaScript this的指向问题

一分钟搞懂 JavaScript this 指向问题

JavaScript中this指向