2011-06-17 55 views
3

我已經創建了一個簡單的'require'機制(https://gist.github.com/1031869),其中包含的腳本被編譯並在新的上下文中運行。但是,當我在包含的腳本中調用函數並將其傳遞給this時,包含的腳本在其中看不到任何屬性。v8無法從新上下文中編譯的腳本訪問屬性

//required.js - compiled and run in new context 
exports.logThis = function(what){ 
    for (key in what) log(key + ' : ' + what[key]); 
} 

//main.js 
logger = require('required'); 
this.someProp = {some: 'prop'} 
logger.logThis({one: 'two'}); //works, prints 'one : two' 
logger.logThis(this); //doesn't work, prints nothing. expected 'some : prop' 
logger.logThis(this.someProp); //works, prints 'some : prop' 
+0

如果在main.js文件中調用它,會顯示logger.logThis(this);'語句嗎? – levu

+0

logger.log從main.js調用的this(this)不顯示任何內容。 如果我在main.js中爲(關鍵字)日誌(關鍵字) 做 ,那麼它會顯示這個屬性(如log函數和someProp)。 但是,如果我在required.js中運行相同的代碼,則不會打印任何內容。 – Florin

+0

這很奇怪,可能是文件錯誤? – levu

回答

4

的問題是,V8不允許上下文訪問另一個上下文的全局變量。因此,logger.logThis(this)不打印任何東西。

這解決了,通過設置在新形勢下的安全令牌:

moduleContext->SetSecurityToken(context->GetSecurityToken()); 

,其中上下文是「主」背景和moduleContext是其中包含的腳本運行的新環境。