Javascript Eval в глобальном масштабе? - PullRequest
31 голосов
/ 12 января 2011

Можно ли использовать команду eval для выполнения чего-либо с глобальной областью действия? Например, это приведет к ошибке:

<script>
 function execute(x){
 eval(x);
 }

 function start(){
  execute("var ary = new Array()");
  execute("ary.push('test');");  // This will cause exception: ary is not defined
 }

</script>
<html><body onLoad="start()"></body></html>

Я знаю, что ключевое слово 'with' задает конкретную область, но есть ли ключевое слово для глобальной области? Или можно определить пользовательскую область, которая бы позволила этому работать?

<script>

 var scope = {};
 function execute(x){
  with(scope){
   eval(x);
  }
 }

 function start(){
  execute("var ary = new Array()");
  execute("ary.push('test');");  // This will cause exception: ary is not defined
 }

</script>
<html><body onLoad="start()"></body></html>

По сути, я пытаюсь создать глобальную функцию выполнения ...

Ответы [ 6 ]

36 голосов
/ 25 апреля 2011
(function(){
    eval.apply(this, arguments);
}(a,b,c))

Это вызовет eval, используя глобальный объект, window в браузерах, в качестве аргумента this, передавая любые аргументы, переданные вами в анонимную функцию.

eval.call(window, x, y, z) или eval.apply(window, arguments) также допустимо, если вы уверены, что window является глобальным объектом.Однако это не всегда так.Например, глобальный объект в скрипте Node.js - process, если я правильно помню.

6 голосов
/ 16 мая 2014

Использование (1, eval)('...').

$ node
> fooMaker = function () { (1, eval)('foo = "bar"'); };
[Function]
> typeof foo
'undefined'
> fooMaker()
undefined
> typeof foo
'string'
> foo
'bar'
6 голосов
/ 16 мая 2011

Вы должны иметь возможность использовать eval() в глобальной области, вызывая его косвенно. Однако не все браузеры в настоящее время делают это.

Дополнительная литература .

2 голосов
/ 27 мая 2011

Чтобы выполнить некоторый JavaScript в глобальной области видимости, вы можете вызвать его косвенно, используя setTimeout () или, если вы используете jQuery, взгляните на $. GlobalEval () .

Изменение метода выполнения на следующий позволит вам по-прежнему использовать ключевое слово 'var':

function execute(x) {
    setTimeout("eval(" + x + ")", 0);
    // Or: $.globalEval(x);
}


function start() {
    try
    {
        execute("var ary = new Array()");
        execute("ary.push('test');");
    }
    catch (e)
    {
        alert(e);
    }
}


start();
1 голос
/ 16 апреля 2015

Использование eval.apply(null, ["code"]);.

eval.apply(this, ["code"]); не работает на сервере сценариев Microsoft (cscript.exe).

1 голос
/ 12 января 2011

Я знаю, что будет много комментариев с eval is evil, и я согласен с этим. Однако, чтобы ответить на ваш вопрос, измените метод запуска следующим образом:

function start(){   
  execute("ary = new Array()");   
  execute("ary.push('test');");  // This will cause exception: ary is not defined  
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...