美文网首页
this到底指的是谁

this到底指的是谁

作者: mah93 | 来源:发表于2019-10-09 16:28 被阅读0次

JavaScript中的this依赖于函数的调用方式,因此把this称为调用上下文很合适。

先来一个最简单的例子

function ask(){
  console.log(this.name)
}
var li_lei = {
  name: "han mei mei",
  ask: ask
}

`这两个方法分别输出什么`
li_lei.ask()             => "li lei"
han_mei_mei.ask()        => "han mei mei"

稍微复杂一点

var li_lei = {
  name: "li lei",
  ask: function (){
    console.log(this.name)
  }
}

var han_mei_mei = {
  name: "han_mei_mei",
  ask: li_lei.ask
}

`这两个方法分别输出什么`
li_lei.ask()             => "li lei"
han_mei_mei.ask()        => "han mei mei"


根据上面的两个例子引出一个概念,请记住:

function中的this一般情况下表示的是调用对象(调用对象.方法名())

那么接下来需要考虑一个问题,在js里经常把function作为回调函数传来传去,用什么手段可以让function中的this保持不变?

让function中的this“保持不变”

使用bind方法

var li_lei = {
  name: "li lei",
  _ask: function(){
    console.log(this.name)
  }
}
li_lei.ask = li_lei._ask.bind(li_lei)

var han_mei_mei = {
  name: "han mei mei"
}
han_mei_mei.ask = li_lei.ask

`这两个方法分别输出什么`
li_lei.ask()             => "li lei"
han_mei_mei.ask()        => "li lei"

改成用类来举例(类的声明用es6语法)

class LiLei {
  constructor() {
    this.name = "li lei";
    this.ask = this._ask.bind(this);
  }
  _ask(){
    console.log(this.name);
  }
}

var li_lei = new LiLei();

class HanMeiMei {
  constructor(li_lei_instance){
    this.name = "han mei mei";
    this.ask = li_lei_instance.ask
  }
}

var han_mei_mei = new HanMeiMei(li_lei)

`这两个方法分别输出什么`
li_lei.ask()             => "li lei"
han_mei_mei.ask()        => "li lei

不使用bind实现同样的效果

class LiLei {
  constructor() {
    this.name = "li lei";
    
    var that = this;
    this.ask = function(){
      console.log(that.name);
    }
  }
}

var li_lei = new LiLei();

class HanMeiMei {
  constructor(li_lei_instance){
    this.name = "han mei mei";
    this.ask = li_lei_instance.ask
  }
}

var han_mei_mei = new HanMeiMei(li_lei)

`这两个方法分别输出什么`
li_lei.ask()             => "li lei"
han_mei_mei.ask()        => "li lei

变复杂一点

class LiLei {
  constructor() {
    this.name = "li lei";
    this.ask = this.bind_ask();
  }
  
  bind_ask(){
    var that = this;
    var fun = function(){
      console.log(that.name);
    }
    return fun;
  }
}

var li_lei = new LiLei();

class HanMeiMei {
  constructor(li_lei_instance){
    this.name = "han mei mei";
    this.ask = li_lei_instance.ask
  }
}

var han_mei_mei = new HanMeiMei(li_lei)

`这两个方法分别输出什么`
li_lei.ask()             => "li lei"
han_mei_mei.ask()        => "li lei

使用ES6中的箭头函数来实现

class LiLei {
  constructor() {
    this.name = "li lei";
    this.ask = () => {
      console.log(this.name)
    };
  }
}

var li_lei = new LiLei();

class HanMeiMei {
  constructor(li_lei_instance){
    this.name = "han mei mei";
    this.ask = li_lei_instance.ask
  }
}

var han_mei_mei = new HanMeiMei(li_lei)

`这两个方法分别输出什么`
li_lei.ask()             => "li lei"
han_mei_mei.ask()        => "li lei

ES6中的箭头函数和普通的function在处理this上是有差别的,根据上面的例子你应该已经明白了:

ES6的箭头函数中的this,永远保持不变,一只表示声明时的this

相关文章

  • this到底指的是谁

    JavaScript中的this依赖于函数的调用方式,因此把this称为调用上下文很合适。 先来一个最简单的例子 ...

  • 文王四友指的是谁?

    俗话说“乱世出英雄”,就以商末周初为例,先有“殷末三仁”及商容,后有以文王四友为代表的诸多贤才。据《史记.周本纪》...

  • apk的签名到底指的是什么?

    apk的签名到底指的是什么?

  • object-c 基础九 【self指针】

    self指的是当前方法是谁调用,self就是谁;

  • 认识你自己

    到底是谁 埋怨着你 到底是谁 惹怒了你 到底是谁 伤害了你 到底是谁 囚禁着你 到底是谁 让你懊恼不已 到底是谁 ...

  • 性自由到底指的是什么?

    网友的提问 性自由到底指的是什么?《道德与文明》里有段关于性自由的限定:性的自由和解放是人的自由解放的重要组成部分...

  • 顺其自然到底指的是什么?

    一旦说到顺其自然,我们自然而然地就会想起庄子的“无为而治”的人生态度和理念。 那么,无为而治究竟是不是...

  • 认识自己,到底指的是什么

    今天这篇文章的灵感来源于朋友LeO的公众号文章的一部分。 过去我们总是说,要认识自己、了解自己,但似乎更关注在我们...

  • 重读红楼系列:情中情因情感妹妹,“妹妹”到底指的是谁?

    读《红楼梦》三十四回,是需要把握几条主线的,主线理清楚了,人物关系以及主观情感脉络就会很清晰,读起来也会更有趣味。...

  • 找到真正的自己

    我们一直都在说爱自己,爱自己,那我们要爱的“自己”到底指的是谁?我们要爱的“自己”是指内在神性,即“真我”,是最高...

网友评论

      本文标题:this到底指的是谁

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