【问题标题】:What does "let _self = this" mean in Javascript/Typescript?Javascript/Typescript 中的“let _self = this”是什么意思?
【发布时间】:2016-12-05 14:01:03
【问题描述】:

在这个code snippet中,为什么this.identifier不起作用而_self.url起作用?

  getConfig() {
    let _self = this;
    return function () {
      this.page.url = this.url || window.location.href;
      this.page.identifier = _self.identifier;
      this.page.category_id = this.categoryId;
      this.language = this.lang;
    };
}

let _self = this 真的是这样吗?

【问题讨论】:

标签: javascript angular typescript


【解决方案1】:

首先,您会获得赞成票,因为这根本不是一个愚蠢的问题。 Stackoverflow 上的某些人有权获得授权。

函数有一个叫做上下文的东西。上下文是调用函数的对象。

let person = {
   name:"bill",
   speak:function(){
      console.log("hi i am "+this.name)
   }
}

如果你要做 person.speak()

它将在已定义的对象上调用。变量person 是上下文

所以当你这么说的时候。和 person.name 一样

现在您可以将函数附加到其他东西上。

var newperson = {name:'jill'}
newperson.speak = person.speak;

当它被调用时,它会打印 hi i am jill。

首先了解这一点。

现在进入第二步。

GetConfig 返回一个函数,但是这个函数没有附加任何对象。

看看这个。

let person = {
   name:"bill",
   getSpeakFunction:function(){
      return function(){
         console.log('hi my name is '+this.name)
      }

   }
}


let func = person.getSpeakFunction()

现在函数func全靠自己了。

现在当它被称为谁是“这个”时,你到底在说谁。 这就是函数的想法。

所以我们可以通过说来帮助函数。

let person = {
   name:"bill",
   getSpeakFunction:function(){
      let context = this; //listen hear function this is what i am talking about
      return function(){
         console.log('hi my name is '+context.name)
      }

   }
}


let func = person.getSpeakFunction()

this 是特殊的语言决定 this 的值,但上下文不是。 context 将是分配给它的任何内容。除非你程序员改变它,否则它不会改变。

所以使用 _self、context、$this 这个词 或其他任何东西,当您将 this 的值分配给它时。 它像任何其他常规变量一样被“锁定”。

let a = 2;
//this will never change

let _self = this //_self will never change as it's your variable 

现在当你调用你的函数时,它会寻找 _self。它确切地知道你在说什么。

ps。我也在寻求选票;)

【讨论】:

    【解决方案2】:

    它获取this 的值(由how the function is called 确定)并将其存储在一个变量中(在闭包中仍然可以访问该变量(调用时将具有不同的this 值) getConfig 正在返回)。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 2019-04-02
      • 1970-01-01
      • 2011-11-23
      • 2011-08-22
      • 1970-01-01
      • 2011-09-10
      • 2018-10-29
      • 2017-06-11
      相关资源
      最近更新 更多