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中这样做,所以我更新了我的答案,非常酷,我使用了类似于()=>{}
的订阅来完成,但我没有这样想。