2011-06-17 12 views
3

シンプルな「要求」メカニズム(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から呼び出されたもので、何も表示されません。 main.jsに (key in this)log(key) を入力すると、(log関数やsomePropのような)これのプロパティが表示されます。 しかし、同じコードをrequired.jsで実行すると、何も印刷されません。 – Florin

+0

これは奇妙なことですが、おそらくバグを報告しますか? – levu

答えて

4

問題はV8は、コンテキストが別のコンテキストのグローバル変数にアクセスすることはできませんということでした。したがって、logger.logThis(this)は何も印刷しませんでした。

これは新しい文脈にセキュリティトークンを設定することによって、解決された:

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

コンテキストは、「メイン」のコンテキストで、moduleContextが含まれているスクリプトを実行するには、新しいコンテキストです。

関連する問題