将函数存储在变量中会破坏"this"上下文



我正在尝试运行以下代码:

public isDataValid(obj: any){
let isCriteriaValid = function (){
for(let element in obj){
if(!this.isStringOrObjectValid(element)){
return false
}
}
return true
}
return (obj != undefined) ? isCriteriaValid() : false
}

快速解释:

运行此函数可以通过检查对象中的所有元素来检查对象是否有效

我对";这个";上下文有点";擦除";。

这个问题是一个叫做scope的小问题。范围不是";擦除";,";这个";关键字指的是一个新的作用域。

isStringOrObjectValid函数的作用域现在是它在其中声明的函数,它是局部变量。我通过将要运行函数的对象传递给三元语句来修复它。像这样:

let isCriteriaValid = function (service){
for(let element in obj){
if(!service.isStringOrObjectValid(element)){
return false
}
}
return true
}
return (obj != undefined) ? isCriteriaValid(this) : false

如果有人有更好的方法,我愿意了解这类范围问题。

您应该能够将作用域传递给变量,然后使用该

public isDataValid(obj: any){
**let that = this;**   
let isCriteriaValid = function () {
for (let element in obj) {
if (!**that**.isStringOrObjectValid(element)) {
return false
}
}
return true
}
return (obj != undefined) ? isCriteriaValid() : false
}

但实际上,在这个时代,你应该使用ES6箭头函数,并且范围将得到维护。。。像这个

public isDataValid2(obj: any) {
let isCriteriaValid = () => {
for (let element in obj) {        
if (!this.isStringOrObjectValid(element)) {
return false;
}
}
return true;
};
return obj !== undefined ? isCriteriaValid() : false;
}

最新更新