VM とは何ですか?
VM モジュールは NodeJS のコア モジュールであり、require メソッドと NodeJS の操作メカニズムをサポートします。場合によっては、特別な処理を実行するために VM テンプレートを使用することもあります。
VM を介して、JS をすぐにコンパイルして実行することも、コンパイルして保存して後で実行することもできます。
VM モジュールには、独立して実行されるサンドボックス システムを作成するために一般的に使用される次の 3 つのメソッドが含まれています。
vm.runInThisContext(コード, ファイル名);
このメソッドは、独立したサンドボックス実行スペースを作成するために使用されます。コード内のコードは外部グローバル オブジェクトにアクセスできますが、他の変数にはアクセスできません。
そしてコードは社内外で共有されます
var vm = require("vm");
var p = 5;
global.p = 11;
vm.runInThisContext("console.log('ok', p)");//グローバルの下に 11
を表示します
vm.runInThisContext("console.log(global)"); // グローバルを表示します
console.log(p);// 5 を表示
vm.runInContext(コード、サンドボックス);
このメソッドは、独立したサンドボックス実行スペースを作成するために使用されます。sandBox はグローバル変数としてコードに渡されますが、グローバル変数
はありません。
サンドボックスの要件は、vm.createContext() メソッドによって作成されたサンドボックスです
var vm = require("vm");
var util = require("util");
var window = {
p: 2、
vm: vm、
コンソール: コンソール、
必要: 必要
};
var p = 5;
global.p = 11;
vm.createContext(ウィンドウ);
vm.runInContext('p = 3;console.log(typeof global);', window); // グローバルは未定義です
console.log(window.p);// は 3
に変更されます
console.log(util.inspect(window));
vm.runInNewContext(コード、サンドボックス、オプト);
このメソッドは runInContext と同じである必要がありますが、sandBox を作成するステップがありません。
比較
より複雑な状況
runInThisContext で runInThisContext が実行されるとどうなりますか? runInThisContext は誰のグローバル オブジェクトにアクセスしますか?
次のコードはどのように実行されますか?
var vm = require("vm");
var util = require("util");
var window = {
p: 2、
vm: vm、
コンソール: コンソール、
必要: 必要
};
window.global = ウィンドウ;
var p = 5;
global.p = 11;
vm.runInNewContext('p = 3;console.log(typeof global);require('vm').runInThisContext("console.log(p)");', window);
runInThisContext 内のコードは外部グローバル オブジェクトにアクセスできますが、実際には外部にグローバル オブジェクトはありません (存在しますが、本質的にはグローバル オブジェクトではありません)。runInThisContext は最上位のグローバル オブジェクトにのみアクセスできることに注意してください。
実行結果は以下の通りです
オブジェクト (グローバルに存在)
11 (トップグローバル p)