JavaScript расширение функции eval ()? - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать свою собственную функцию eval в JavaScript, которая будет выполнять строку в окружающем контексте, например, eval, плюс добавить еще несколько вещей.

Итак, в общем, при выполнении:

eval("var foo = 8");
foo; // === 8

Нет проблем; однако, когда я хочу расширить eval своей собственной функцией, например так:

function myEval(str) {
    return eval(str);
}
myEval("var foo = 8");
foo; //error, "foo" is not defined etc.....

И очевидная причина в том, что в myEval вызываемая функция eval выполняется только в области действия этой функции, а не в окружающая область.

Мне было интересно, возможно ли выполнить eval в области, в которую была вызвана его окружающая функция, чтобы расширить JavaScript функцию eval?

1 Ответ

0 голосов
/ 08 апреля 2020

Разобрался, просто оберните функцию eval в другую функцию и вызовите эту другую функцию в окружающей области видимости следующим образом:

function g(str) {
    return {
        eval,
        go(){
            this.eval(`
              //some other cool stuff
              let test = 1000;
              ${this.str}
            `)
        },
        str
    }
}
g("var pp = 3 * test").go()
console.log(pp);

РЕДАКТИРОВАТЬ:

это фактически выполняет это:

function str(cod1,cod2) {
    return `
        ${cod1};
        (function(...args) {
            ${cod2}
        })
    `
}

function scope1() {
  eval(str(
    `
      var x,
          y,
          z
    `,
    `
      x = args[0];
      y = args[1];
      z = args[2];

    `
  ))(1, {test(){return "ing"}}, {ok:"string"})
  console.log(x,y.test(),z, "scope1");
}

scope1();

try {
  console.log(x, y, z);
} catch(e) {
  console.log(e.toString());
}
...