no-this-alias
NOTE: this rule is part of the
recommended rule set.Enable full set in
deno.json:{
"lint": {
"rules": {
"tags": ["recommended"]
}
}
}Enable full set using the Deno CLI:
deno lint --rules-tags=recommended
This rule can be explictly included to or excluded from the rules present in the current tag by adding it to the
include or exclude array in deno.json:{
"lint": {
"rules": {
"include": ["no-this-alias"],
"exclude": ["no-this-alias"]
}
}
}不允许将变量赋值给 this。
在大多数情况下,通过正确使用箭头函数,可以避免将 this 存储在变量中,因为它们根据定义箭头函数的作用域确定 this。
让我们看一个具体的例子:
const obj = {
count: 0,
doSomethingLater() {
setTimeout(function () { // 这个函数在全局作用域中执行;`this` 评估为 `globalThis`
this.count++;
console.log(this.count);
}, 300);
},
};
obj.doSomethingLater();
// 打印 `NaN`,因为属性 `count` 不在全局作用域中。
在上面的例子中,传递给 setTimeout 的函数中的 this 评估为 globalThis,这导致预期的值 1 没有被打印。
如果您想在不使用箭头函数的情况下解决这个问题,可以将 this 的引用存储在另一个变量中:
const obj = {
count: 0,
doSomethingLater() {
const self = this; // 将 `this` 存储在 `self` 中
setTimeout(function () {
// 使用 `self` 代替 `this`
self.count++;
console.log(self.count);
}, 300);
},
};
obj.doSomethingLater();
// 打印 `1`,如预期
但在这种情况下,箭头函数非常有用。使用箭头函数,代码变得更加清晰和易于理解:
const obj = {
count: 0,
doSomethingLater() {
setTimeout(() => { // 使用箭头函数
// 此处 `this` 评估为 `obj`
this.count++;
console.log(this.count);
}, 300);
},
};
obj.doSomethingLater();
// 打印 `1`,如预期
这个例子来自 MDN。
无效的:
const self = this;
function foo() {
const self = this;
}
const bar = () => {
const self = this;
};
有效的:
const self = "this";
const [foo] = this;