在特定的上下文中调用eval()

我有以下的javaScript“类”:

A = (function() { a = function() { eval(...) }; A.prototype.b = function(arg1, arg2) { /* do something... */}; })(); 

现在让我们假设在eval()我传递包含expression式调用b与一些参数的string:

  b("foo", "bar") 

但是,然后我得到错误,没有定义b。 所以我的问题是:如何在类A的上下文中调用eval?

其实你可以通过一个函数完成这个抽象:

 var context = { a: 1, b: 2, c: 3 }; function example() { console.log(this); } function evalInContext() { console.log(this); //# .logs `{ a: 1, b: 2, c: 3 }` eval("example()"); //# .logs `{ a: 1, b: 2, c: 3 }` inside example() } evalInContext.call(context); 

所以你用你想要的context call函数,并在该函数内运行eval

奇怪的是,这似乎是为我在本地工作,但不是普朗克 !

对于一个简洁的(可以说是多汁的)版本,你可以逐字复制到你的代码中,使用这个:

 function evalInContext(js, context) { //# Return the results of the in-line anonymous function we .call with the passed context return function() { return eval(js); }.call(context); } 

如何在给定的上下文中调用eval? 3个字。 使用闭包。

 var result = function(str){ return eval(str); }.call(context,somestring); 

巴姆。

编辑

尽pipeeval.call和eval.apply不会强制正确地传递上下文,但可以使用闭包来强制eval在所需的上下文中执行,如@Campbeln和@user3751385的答案中所述

我原来的答案

这不可能。 Eval仅在本地上下文(直接使用)或全局上下文中调用(即使使用eval.call)。

例如, a = {}; eval.call(a, "console.log(this);"); //prints out window, not a a = {}; eval.call(a, "console.log(this);"); //prints out window, not a

欲了解更多信息,请看这里这个伟大的文章

这里有一篇讨论在不同的上下文中运行eval()的文章:

http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context

通常你用eval.call()eval.apply()

这里还有关于eval()及其用例的信息:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/eval

绝对不是正确的答案,请不要使用声明,除非你知道你在做什么,但为了好奇,你可以这样做

  var a = {b: "foo"}; with(a) { // prints "foo" console.log(eval("b")); // however, "this.b" prints undefined console.log(eval("this.b")); // because "this" is still the window for eval // console.log(eval("this")); // prints window // if you want to fix, you need to wrap with a function, as the main answer pointed out (function(){ console.log(eval("this.b")); // prints foo }).call(a); } // so if you want to support both with (a) { (function (){ console.log("--fix--"); console.log(eval("b")); // foo console.log(eval("this.b")); // foo }).call(a); } 

另一个Bam!

 eval('(function (data) {'+code+'})').call(selector,some_data); 

这个例子将保持你的上下文并发送一些数据。 在我的情况下,是一个DOMselect器

 var evalWithinContext = function(context, code) { (function(code) { eval(code); }).apply(context, [code]); }; evalWithinContext(anyContext, anyString);