一文读懂this

作者: ing1023 | 来源:发表于2019-06-11 00:12 被阅读1次

在学习js的过程中,this是绕不过的一道坎。今天我将通过这一篇文章来帮助大家全方位解读this。
对于this指向的理解,有这样一种说法:谁调用它,它就指向谁。
在大多数情况下,这样理解其实是说的通的。

一、函数在调用时就确定了this指向。

示例一:
var a = 10;
var obj = {
  a: 20
}

function fn () {
  console.log(this.a)
}
fn();   // 10
fn.call(obj)   // 20

二、在函数执行过程中,this一旦被确定,就不可更改了。

示例二:
var a = 10;
var obj = {
  a: 20
}

function fn () {
  this = obj;   // 这句话试图修改this,运行后会报错
console.log(this.a);
}

fn();

-1. 全局对象中的this
全局环境中的this,指向它本身。

// 通过this绑定到全局对象
this.a1 = 10;

// 通过声明绑定到变量对象,但在全局环境中,变量对象就是它自身
var a2 = 20;

// 仅仅只有赋值操作,标识符会隐式绑定到全局对象
a3 = 30;
console.log(a1)// 10
console.log(a2)  // 20
console.log(a3)  // 30
  • 2.函数中的this
    在总结函数总this指向之前,我们有必要通过一些奇怪的例子,来感受一下函数中this的捉摸不定。
// demo01
var a = 20;
function fn () {
  console.log(this.a);
}
fn()  // 20--->相当于window.fn(),详细后边会说

// demo02
var a = 20;
function fn () {
function foo () {
console.log(this.a)
}
foo()
}
fn() // 20

// demo03
var a = 20;
var obj = {
  a: 10,
  c: this.a + 20,
  fn: function () {
        return this.a
  }
}

console.log(obj.c)  // 40  --->this指向window
console.log(obj.fn())  // 10  --->this指向obj

1.在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。
2.如果调用者函数被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。
3.如果函数独立调用,那么该函数内部的this指向undefined。但是在非严格模式中,当this指向undefined时,它会被自动指向全局对象。

function fn () {
  'use strict';
  console.log(this)
}
fn ()  // undefined
window.fn() // window
// 我们修改一下demo03的代码,看一下会发生什么变化。
'use strict';
var a = 20;
function foo () {
 var a = 1;
 var obj = {
   a: 10,
   c: this.a + 20,
   fn: function () {
         return this.a
   }
 }
 return obj.c
}

console.log(foo())  // 报错--->此时this指向undefined,obj.c = undefined.a + 20,所以报错
console.log(window.foo())  // 因为js是单线程,上边输出报错,所以这儿不会执行。如果上边错误解决,此处输出40,this指向window。
再来看一些容易理解错误的例子,加深一下对调用者与是否独立运行的理解。
var a = 20;
var foo = {
    a: 10,
    getA: function () {
        return this.a;
    }
}
console.log(foo.getA()); // 10

var test = foo.getA;
console.log(test());  // 20
var a = 20;
function getA() {
    return this.a;
}
var foo = {
    a: 10,
    getA: getA
}
console.log(foo.getA());  // 10
function foo() {
    console.log(this.a)
}

function active(fn) {
    fn(); // 真实调用者,为独立调用
}

var a = 20;
var obj = {
    a: 10,
    getA: foo
}

active(obj.getA);   // 20--->this指向window

相关文章

网友评论

    本文标题:一文读懂this

    本文链接:https://www.haomeiwen.com/subject/tslxfctx.html