3

含まれているスクリプトがコンパイルされ、新しいコンテキストで実行される、単純な「require」メカニズム(https://gist.github.com/1031869 )を作成しました。ただし、インクルードされたスクリプトで関数を呼び出して渡すとthis、インクルードされたスクリプトにプロパティが表示されません。

//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'
4

1 に答える 1

4

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

これは、新しいコンテキストにセキュリティトークンを設定することで解決されました。

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

ここで、contextは「メイン」コンテキストであり、moduleContextは含まれているスクリプトが実行される新しいコンテキストです。

于 2011-06-28T07:43:59.853 に答える