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

Angular 将函数存储在变量中会破坏;这";上下文,angular,Angular,我正在尝试运行以下代码: public isDataValid(obj: any){ let isCriteriaValid = function (){ for(let element in obj){ if(!this.isStringOrObjectValid(element)){ return false } } return true } return (obj != und

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

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
}
快速解释:

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


我有一个关于“这个”上下文被“擦除”的问题。

这个问题是一个称为范围的小问题。作用域未被“擦除”,“this”关键字指的是一个新的作用域

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

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

如果有人有更好的方法,我愿意学习这种类型的范围问题。

这个问题是一个叫做范围的小问题。作用域未被“擦除”,“this”关键字指的是一个新的作用域

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

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

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

这回答了你的问题吗?tldr:JavaScript中的函数是“未绑定的”。这是否回答了您的问题?tldr:JavaScript中的函数是“未绑定的”。是的,您可以这样做。尽管为什么不把它作为一个参数来传递呢?你在吹毛求疵,生命太短暂了,不必担心这两种方式之间的细微差别。。。。你真的应该在ES6中这样做,所以我更新了我的答案,非常酷,我使用了类似于
()=>{}
的订阅来完成,但我没有这样想。是的,你可以这样做。尽管为什么不把它作为一个参数来传递呢?你在吹毛求疵,生命太短暂了,不必担心这两种方式之间的细微差别。。。。你真的应该在ES6中这样做,所以我更新了我的答案,非常酷,我使用了类似于
()=>{}
的订阅来完成,但我没有这样想。