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);
}