Javascript eval on global scope?

不羁的心 提交于 2019-12-28 04:01:40

问题


Is it possible to use the eval command to execute something with a global scope? For example, this will cause an error:

<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>

I know the 'with' keyword will set a specific scope, but is there a keyword for the global scope? Or is it possible to define a custom scope that would allow this to work?

<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>

Essentially, what I am trying to do is have a global execute funciton...


回答1:


(function(){
    eval.apply(this, arguments);
}(a,b,c))

This will invoke eval using the global object, window in browsers, as the this argument passing any arguments you've passed into the anonymous function.

eval.call(window, x, y, z) or eval.apply(window, arguments) is also valid if you're certain window is the global object. This isn't always true, however. For instance, the global object in a Node.js script is process if I remember correctly.




回答2:


You should be able to use eval() in global scope by calling it indirectly. However, not all browsers are currently doing this.

Further Reading.




回答3:


Use (1, eval)('...').

$ node
> fooMaker = function () { (1, eval)('foo = "bar"'); };
[Function]
> typeof foo
'undefined'
> fooMaker()
undefined
> typeof foo
'string'
> foo
'bar'



回答4:


To execute some JavaScript in the global scope you can call it indirectly by using setTimeout() or if you are using jQuery, take a look at $.globalEval().

Changing your execute method to the following will allow you to still use the 'var' keyword:

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();



回答5:


I know there will be lot of comments coming in with eval is evil and I agree with that. However, to answer your question, change your start method as follows:

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



回答6:


Use eval.apply(null, ["code"]);.

eval.apply(this, ["code"]); does not work on Microsoft Script Host (cscript.exe).



来源:https://stackoverflow.com/questions/4670805/javascript-eval-on-global-scope

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!