【问题标题】:JS how to avoid using "this" [duplicate]JS如何避免使用“this” [重复]
【发布时间】:2018-11-02 18:12:50
【问题描述】:

我最近看了一个 youtube 教程,这个人在这个系列中做了一些有趣的事情(它是 Raining Chain 的 node.js 游戏教程)。他的构造函数是这样的:

const MakeStuff = function(param1, param2) {
  const self = {};
  self._param1 = param1;
  self._param2 = param2;
  // and so on...
  return self;
}

const someStuff = MakeStuff(param1, param2);

然后我检查了谷歌的“self”是什么意思,它发现它类似于“this”......现在真的让我很困惑。起初我以为他只是将其命名为“self”以模仿“this”,但请避免使用它。

另外,JSLint 真的很讨厌“this”,我讨厌让 JSLint 变笨并禁用或编辑选项 (ocd),所以我想弄清楚我将如何使用类,并避免在里面使用“this”类构造函数。

我想我会在 babeljs 中复制/粘贴我的类函数,然后看看类语法实际上在后台做了什么,但我更加困惑。

我的游戏中有大约 2k 行代码,而 1.5k 只是带有 getter、setter 和静态方法的类。

上面的代码实际上做了什么?自我是什么意思?我可以使用 JS 类并避免在构造函数中使用“this”吗?为什么 JSLint 甚至讨厌“这个”?我是否应该使用上面的示例重新编写代码并使用原型绑定 getter、setter 和静态方法?

谢谢!

【问题讨论】:

  • 在这种情况下,self 只是一个变量,最初分配为空白对象,然后在返回之前附加了一些字段。将其称为 self 而不是 thingmine 或任何其他名称并没有什么特殊。在函数的范围内,它只是一个标签,当你返回它时,它就会变成你分配给它的东西(在这种情况下是someStuff)。
  • 这可能会有所帮助:stackoverflow.com/questions/16875767/…

标签: javascript this


【解决方案1】:

截至目前,其他语言使用self代替js的this;它是对实例上下文的引用。在这个用例中,他写的不是构造函数,而是工厂。 self 在这里只是一个命名约定。如果他写的话也没什么区别:

const MakeStuff = function(param1, param2) {
  const obj = {};
  obj._param1 = param1;
  obj._param2 = param2;
  // and so on...
  return obj;
}

const someStuff = MakeStuff(param1, param2);

另外,如果提到 self,请 +1 到 brk,除非重新设置,否则引用 window

【讨论】:

    【解决方案2】:

    对我来说MakeStuff 只是一个函数,而不是构造函数。而self 与您提供的代码中的this 没有任何关系。这只是函数内部的一个变量,它被分配了一些键和元素param1param2

    const MakeStuff = function(param1, param2) {
      const returnedElement = {};
      returnedElement ._param1 = param1;
      returnedElement ._param2 = param2;
      // and so on...
      return returnedElement ;
    }
    
    const someStuff = MakeStuff(param1, param2);
    

    有时您需要使用self(有些使用that)来访问this,但在另一个范围内。

    您可以在 another SO thread 上找到一个很好的解释:

    var self = this;

    [This is] 保留对 当前对象 的引用,因此稍后当您调用 [self] 时,您是在 对该对象 调用该方法,而不是任何其他的。

    【讨论】:

      【解决方案3】:

      this 是 JavaScript 的重要方面之一,但却是人们最了解的方面之一。了解在 JS 中进行任何对游戏设计至关重要的面向对象编程是绝对必要的。

      我建议了解范围以及this 如何应用于不同范围内的不同事物。

      基本上是在你运行诸如

      之类的函数时

      函数 window_scope() {

      this.foobar;

      }

      this 是浏览器中的window 或任何定义为全局范围的变量。含义this.foobar等于window.foobar

      当你在调用var newfoo = new foo()等函数时执行new

      函数 foo() {

      this.foobar;

      }

      this 突然变成了对newfoo 的引用。含义 this.foobar 等于 newfoo.foobar 这允许您创建不需要引用实际局部变量 newfoo 的对象

      【讨论】:

      • 提供了非常有用的链接。我无法决定选择哪一个作为答案,因为它们都是同样好的答案。感谢大家的帮助。
      【解决方案4】:

      上面的代码实际上做了什么?

      const MakeStuff = function(param1, param2) {
        const self = {};
        console.log(self);
        self._param1 = param1;
        self._param2 = param2;
        // and so on...
        return self;
      }
      
      const someStuff = MakeStuff(1, 2);
      console.log(someStuff)

      上面的代码只是调用了一个函数,它接受两个参数并返回一个对象。self在这个函数内部只是一个变量

      自我是什么意思?

      除非专门设置self指的是window对象。但是在上面的函数中const self不是window.self

      console.log(self)

      【讨论】:

        【解决方案5】:

        在您的情况下, self 只是一个常量的名称。

        【讨论】:

          猜你喜欢
          • 2015-05-21
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          • 1970-01-01
          • 2016-05-05
          • 2010-10-13
          • 2022-01-08
          • 1970-01-01
          相关资源
          最近更新 更多