2013-04-01 55 views
1

创建返回值我愿做这样的事情:的Javascript:在EVAL

function end(){ console.log(this); } // <-- the problem is here with `this` 
eval('var a = 0; setTimeout(function(){ a = 10; end(); }, 2000)'); 

这2秒后应该输出:

{ "a" : 10 } 

这在某种程度上可能吗?

+1

[你真的不应该使用'eval'(http) ://stackoverflow.com/q/197769/1615483)。 –

+0

@Adam,将'end()'改为'end.call({“a”:a})''。那是你要的吗? – Pacerier

回答

3

是:

function end(){ console.log(this); } 
eval('var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000)'); 

注意,我设置一个变量,self,是this,然后调用end时,这使我们能够在通话过程中设置this特定值使用Function#call。这是有效的,因为传递给setTimeout的匿名函数引用了创建它的执行上下文以及其中的所有变量,因此可以访问self(和a)。

如果使用eval(我没有看到一个在这里)一个很好的理由不,我不会,只是这样做:

function end(){ console.log(this); } 
var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000); 

你也可以创建第二个功能当被叫时,转身并拨打end以及this的值。这就是所谓的结合,并通过ES5 Function#bind function便利:

function end(){ console.log(this); } 
var a = 0, boundEnd = end.bind(this); setTimeout(function(){ a = 10; boundEnd(); }, 2000); 

由于您使用的NodeJS,你使用的V8引擎,其中有Function#bind。 (如果你在浏览器中这样做,如果你需要支持旧浏览器,你必须小心地为bind提供一个垫片。)

+0

我想使用'eval'的原因是因为javascript存储在一个文件中,我必须对它进行评估。 – Adam

+0

有没有一种方法来获取在eval内创建的变量?使用'this',我可以从node.js – Adam

+0

中获取全局变量中的所有对象。请检查一下从这个版本发展而来的进一步问题吗? http://stackoverflow.com/questions/15753308/javascript-how-to-get-the-variables-that-were-created-inside-a-function – Adam