class SomeClass {
constructor() {
this.x = 0;
}
getSomething(inputVal) {
let self = this;
return new Promise((resolve, reject) => {
setTimeout(function(){
if(inputVal){
self.x = 1;
resolve();
}
else{
self.x = -1;
reject();
}
}, 10);
});
}
我必须使用名为self
的变量来引用this
。这样做有误吗?如果没有,我该怎么做呢?
答案 0 :(得分:2)
这样做不对吗?
不,显然这种方法并没有错,它只是一种将引用保留到this
对象的方法。
但是有一些替代方法可以解决这个问题:
bind
方法。bind()方法创建一个新函数,当被调用时,它具有它 此关键字设置为提供的值,具有给定的序列 调用新函数时提供的任何参数。
getSomething(inputVal) {
return new Promise((resolve, reject) => {
setTimeout(function(){
if(inputVal){
this.x = 1;
resolve();
}
else{
this.x = -1;
reject();
}
}.bind(this), 10);
});
}
arrow
函数。在arrow
个函数之前,每个new
函数都定义了自己的this
值。
例如,this
在构造函数的情况下可以是新对象。
function Person(age){
this.age=age;
console.log(this);
}
let person=new Person(22);
如果创建的函数可以像this
那样访问,那么base
可以指向到obj.getAge()
对象。
let obj={
getAge:function(){
console.log(this);
return 22;
}
}
console.log(obj.getAge());
arrow
函数不会创建自己的this
,它只使用this
执行enclosing
的{{1}}值。另一方面,context
函数使用父范围的arrow
。
this
答案 1 :(得分:1)
class SomeClass {
constructor() {
this.x = 0;
}
getSomething(inputVal) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (inputVal) {
console.log(this.x);
this.x = 1;
resolve();
}
else {
this.x = -1;
reject();
}
}, 10);
});
}
}
const test = new SomeClass();
test.getSomething(true);
在setTimeout中使用箭头功能