Если вы сделаете что-то вроде:
this.TestClass.call("this");
и в TestCalss:
console.log(eval(pString));
Вы обнаружите, что он регистрируется как объект window
.Строка this
не берет контекст с собой.Если бы вы зарегистрировались, window.arrTest1
, это дало бы вам желаемый результат.
Итак ...
Вам нужно передать контекст:
this.TestClass.Run.call(this, "this.arrTest1 = [1]");
И в вашем TestCalss
TestClass = {
Run : (pString) => {
return eval(pString)
}
};
Почему не работает eval.call (this, pString)?
Есть что-то другое вкак eval()
работает.eval()
не настоящая функция JavaScript.Как здесь ответили: Как переопределить функцию eval в javascript?
Как вы уже пытались в своем вопросе, вы сделали что-то вроде:
(0, eval)(pString); // this is an indirect call to eval
Что такое косвенныйВызов ??
Согласно ES5, все это косвенные вызовы, и они должны выполнять код в глобальной области видимости
Область видимости gloabl в вашем случае будет ничем, машинописьdefault не предоставляет глобальной области видимости.(Насколько я знаю)
Существует очень подробное описание о eval
, написанное здесь: http://perfectionkills.com/global-eval-what-are-the-options/
Согласно приведенной выше ссылке, ниже приведены некоторые примеры косвенных eval
звонки:
(1, eval)('...')
(eval, eval)('...')
(1 ? eval : 0)('...')
(__ = eval)('...')
var e = eval; e('...')
(function(e) { e('...') })(eval)
(function(e) { return e })(eval)('...')
(function() { arguments[0]('...') })(eval)
this.eval('...')
this['eval']('...')
[eval][0]('...')
eval.call(this, '...') <-- This is your case.
eval('eval')('...')
Еще один абзац из статьи:
Не понимая, что происходит, некоторые люди, к сожалению, придумывают довольно чудовищные решения, такие как eval.call (window, '... '), window.eval.call (window,' ... ') и даже более сложные комбинации.Все это, опять же, не что иное, как косвенные вызовы eval.
Также есть очень хороший параграф, объясняющий, почему (0, eval)(pString)
является косвенным.Пожалуйста, посмотрите.К сожалению, я мог найти любую подходящую причину, чтобы объяснить, почему eval.call(this, '...')
является косвенным.Возможно, нам придется удовлетворяться утверждением, что eval()
не является реальной функцией ().