2013-04-01 97 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