Javascript ES6如何在类内,在另一个上下文中获取这个

Javascript ES6如何在类内,在另一个上下文中获取这个,javascript,ecmascript-6,babeljs,Javascript,Ecmascript 6,Babeljs,我在搜索,但找不到一个合适的方法来解决这个问题 class MyClass { // i can't event decalre _this/_self here constructor() { setTimeout(function(){ // other work.. hiUser(); // this.hiUser() or //_this.hiUser() not working },1000); } hiUser(

我在搜索,但找不到一个合适的方法来解决这个问题

class MyClass {
  // i can't event decalre _this/_self here
  constructor() {
     setTimeout(function(){
        // other work..
        hiUser(); // this.hiUser() or //_this.hiUser() not working
     },1000);
   }
   hiUser(){
     alert('Hi');
   }
}
您可以使用:

或者,您可以使用简单的:


有一种方法,因此,根据您(可能)使用的transpiler(例如Babel或Typescript),您可以设置ES7标志并在今天使用:

class MyClass {
  constructor() {
    setTimeout(::function() {
      this.hiUser();
    }, 1000);
  }

  hiUser(){
    alert('Hi');
  }
}

setTimeout
可能有自己的
上下文。您可以在构造函数中设置
\u self
,或者使用箭头函数:

class MyClass {
    constructor () {
        var self = this;
        // etc.
    }
}

前面的答案只提供了关于如何修复它的代码示例;让我解释一下你的问题以及为什么会这样

在代码示例中,setTimeout中的函数被绑定到setTimeout的
值(在严格模式下通常为
窗口
未定义


在ES6中,他们引入了lambda表达式(箭头函数),它们是“词汇绑定的”——这意味着它们从其外部范围借用了
值。在您的例子中,这就是类/对象

为了利用lambda表达式s,它将如下所示:

class Foo {

    constructor () {
        setTimeout(() => this.myMethod(), 1000);
    }

    myMethod () {
        console.log('foo');
    }
}

如果您使用Babel来传输代码,并且使用实验性功能,那么您也可以使用ES7的绑定语法来解决您的问题

如果绑定函数/方法,它将创建该函数的副本,并将
值绑定到您选择的任何值。这将允许您使用将绑定到类/对象的
函数
语句

更简短的版本如下所示

constructor () {
    setTimeout(this::this.myMethod, 1000);
}

如果您在理解这一点上仍然存在问题,我建议您阅读更多关于ES6类和javascript绑定的内容。

我不仅仅想调用hiUser,我还需要一个可以执行其他操作的函数。@dev.mraj您可以使用花括号,然后放上您想要的任何内容。我已经更新了我的答案。@Nick好的,完成了!:)请停止称它们为“胖箭头”函数。这是咖啡脚本的剩余部分。他们只是。对于通过我的路线来这里的人来说,这是为了找出“这”行为不正常的原因,我发现这一部分从这个答案的第一个链接中特别有用:“箭头函数对此没有自己的定义。使用封闭词法范围的此值;箭头函数遵循普通变量查找规则。因此,当搜索当前范围中不存在的this时,arrow函数最终从其封闭范围中找到this。“这不是es6的方式。我以前可以这样做。@dev.mraj
//我不能在这里使用event-decare\u this/\u self
这并不能说明您不想要这个解决方案。我的意思是,我不能在类外声明@X.L.Ant所说的内容……如果您要设置
self
,那么您应该在构造函数内执行,而不是在类内。但只要使用像@Buzinas所说的箭头函数,请不要再称它们为“胖箭头”函数。这是咖啡脚本的剩余部分。“他们只是,”娜奥米克,我更喜欢叫他们兰达斯;我只是使用箭头函数来确保人们知道我指的是什么。当然,“lambda”、“匿名函数”、“闭包”等等。如果您阅读了我链接的规范,ECMAScript将它们称为“箭头函数”。我的意思是,你没有称它们为“箭头函数”,你称它们为“胖箭头函数”,这是咖啡脚本的行话。是的,我通常不会——这是在读了这里的另一个答案后在我脑海中出现的。
setTimeout(function () {
    // this === window
}, 1000);
class Foo {

    constructor () {
        setTimeout(() => this.myMethod(), 1000);
    }

    myMethod () {
        console.log('foo');
    }
}
class Foo {

    constructor () {
        setTimeout(this::function() {
            this.myMethod();
        }, 1000);
    }

    myMethod () {
        console.log('foo');
    }
}
constructor () {
    setTimeout(this::this.myMethod, 1000);
}