4

誰かが次の動作を理解するのを手伝ってくれますか? このコールバック内からグローバルを設定できるので、それを変更fすることもできるはずです。これを理解するために、ノードが REPL でコンテキストとグローバルをどのように処理するかを十分に理解していないので、洞察をいただければ幸いです。

なしで REPL を開始するuseGlobal

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

f次に、2 回続けて設定してみてください。

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

初めて動作します...もう一度やり直してください:

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

は!

最初の実行で設定されます。2番目は影響しません。

(設定useGlobal:true期待どおりの動作が得られます。)

4

2 に答える 2

2

これは、舞台裏でコードを実行している Node の欠陥のある vim モジュールが原因です。useGlobal を無効にすると、コードの実行方法が変更され、vm.runInThisContext から vm.runInContext に変更されます [1]。基本的に何が起こるかというと、指定されたサンドボックス オブジェクトからコードを実行する実際のグローバル オブジェクトにすべての変数をコピーし、コードを実行してから、すべてをコピーして戻します。setTimeout を使用すると、すべてがコピーされた後に変更が行われます。これの責任の一部は repl モジュール [2] にあり、一部は vm モジュール [3] にあります。次のバージョンでは vm モジュールのオーバーホールが予定されていると思います。

于 2012-10-04T10:14:37.840 に答える