В этом случае невозможно сделать eval
не «злом», потому что это зло. Вместо этого следует использовать соответствующее идиоматическое решение.
eval(pString);
(eval)(pString);
- это способы, которые должны быть работоспособными, по сути, они одинаковы, потому что перенос eval
в скобках ничего не дает. Остальные значения eval
используются косвенно, что приводит к оценке кода в глобальной области видимости.
Это будет работать только с целью ES6. Можно увидеть, что класс переносит в с целью ES5, трюк var _this = 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
для выполнения кода внутри класса, к которому он принадлежит, это все равно может считаться неподходящим решением.