ホームページ >ウェブフロントエンド >jsチュートリアル >NodeJs_node.jsのVMモジュールの詳細説明

NodeJs_node.jsのVMモジュールの詳細説明

WBOY
WBOYオリジナル
2016-05-16 16:00:512107ブラウズ

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)

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。