2012-08-26 77 views
4

有人能幫我理解下列行爲嗎?我預計,因爲我可以設置全球f從這個回調裏面,我應該也可以更改它。我對REPL中的節點處理上下文與全局是如何理解這一點並不十分了解,我很感謝任何見解。NodeJS REPL:爲什麼這個變量賦值失敗?

啓動REPL沒有useGlobal

$ cat test.js 
var repl = require('repl'); 
repl.start({useGlobal:false}); 

現在嘗試在一排設置f兩次:

$ node test.js 
> f 
ReferenceError: f is not defined 
> setTimeout(function(){f=1;}, 0); 
> f 
1 

作品第一次......現在再試一次:

> setTimeout(function(){f=2;}, 0); 
> f 
1 

咦!

第一次運行設置它;第二個不影響它。

(設置useGlobaltrue我得到我所期望的行爲。)

+0

只是一個注:問題與延遲> 0也存在,並用匿名函數NOT存在: '!function(){f = 2}();'按預期工作。我沒有想法......也許是一個錯誤? –

+0

我認爲「this」https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout#The_.22this.22_problem對「this」問題有一些影響:) –

+0

@chumkiu關鍵字「這個「不在代碼中使用。爲什麼要對上述問題負責? – Javaguru

回答

2

這是因爲節點的故障VIM模塊,它是何等的運行代碼在幕後的。當禁用useGlobal時,它會改變它運行代碼的方式,從vm.runInThisContext更改爲vm.runInContext [1]。本質上發生的是,它將指定沙箱對象的所有變量複製到其運行代碼的實際全局對象中,執行代碼,然後將所有內容都複製回來。當你使用setTimeout時,在之後,所做的更改都會被複制回。這部分歸咎於repl模塊[2]和部分在vm模塊[3]中。我相信這個虛擬機模塊將用於下一個版本的檢修。