Angular 理解评估参考
我知道在这个话题上还有其他的线索,但我再次提问,因为我真的很努力地理解eval,以及如何正确地使用它,这样它就不会变得邪恶。通过查看此代码,我如何获得Angular 理解评估参考,angular,typescript,eval,Angular,Typescript,Eval,我知道在这个话题上还有其他的线索,但我再次提问,因为我真的很努力地理解eval,以及如何正确地使用它,这样它就不会变得邪恶。通过查看此代码,我如何获得console.log(this.arrTest)是否记录[“返回原始”]?我尝试了许多变体,但都不起作用 我不想要这个解决方案,请:this.TestClass.Run.call(this,“this.arrTest=['返回原始'];”我需要类级别内的解决方案 下面是一个角度闪电战: 我已经阅读了这两篇文章,但我不理解其中的解决方案: 在这种
console.log(this.arrTest)代码>是否记录[“返回原始”]
?我尝试了许多变体,但都不起作用
我不想要这个解决方案,请:this.TestClass.Run.call(this,“this.arrTest=['返回原始'];”代码>我需要类级别内的解决方案
下面是一个角度闪电战:
我已经阅读了这两篇文章,但我不理解其中的解决方案:
在这种情况下,没有办法让eval
不“邪恶”,因为它是邪恶的。应该使用合适的惯用解决方案
eval(pString);
(eval)(pString);
这些方法应该是可行的,它们本质上是相同的,因为用括号包装eval
。其余的eval
s被间接使用,这导致在全局范围内评估代码
这仅适用于ES6目标。可以看到ES5目标为var\u this=this
的类用于将this
从封闭范围传递到箭头函数这个
在Run
方法中保持不变,是TestClass
对象,而不是类实例。因此,
this.TestClass.Run("_this.arrTest = ['Back to Original'];");
将使用ES5而不是ES6 TypeScript目标
这是一个很好的例子,说明了为什么eval
被认为是“邪恶的”。它会导致不类型化、不可预测、不安全和未优化的混乱,这可以通过遵循“良好”的编码实践来避免
尚不清楚TestClass.Run的要求是什么,但通常通过回调来处理此类场景:
constructor() {
this.TestClass.Run(() => {
this.arrTest = ['Back to Original'];
});
console.log(this.arrTest);
};
TestClass = {
Run : (cb: () => void) => {
// class instance can be passed to callback as an argument
// or cb.call(this) when needed
cb();
}
};
根据引入TestClass
成员以在其所属的类中执行代码的原因,这仍然可能被认为是不合适的解决方案。因此,在我的场景中,这很好地解决了问题:
export class AppComponent {
arrTest = ['Original'];
constructor() {
this.TestClass.Run("arrTest", "['Back to Original']");
console.log(this.arrTest);
};
TestClass = {
Run : (pKey, pValue) => {
this.arrTest = ['Changed']; //So this works
this[pKey] = pValue;
}
};
}
我真的没有时间深入研究评估是如何工作的,但我想在这里你会找到答案:天哪,我还没到能够解决这个问题的水平!除息的
export class AppComponent {
arrTest = ['Original'];
constructor() {
this.TestClass.Run("arrTest", "['Back to Original']");
console.log(this.arrTest);
};
TestClass = {
Run : (pKey, pValue) => {
this.arrTest = ['Changed']; //So this works
this[pKey] = pValue;
}
};
}