Apakah itu VM?
Modul VM ialah modul teras dalam NodeJS, menyokong kaedah yang diperlukan dan mekanisme pengendalian NodeJS Kadangkala kami juga boleh menggunakan templat VM untuk melakukan beberapa perkara istimewa.
Melalui VM, JS boleh disusun dan dijalankan serta-merta atau disusun, disimpan dan dijalankan kemudian
Modul VM mengandungi tiga kaedah yang biasa digunakan untuk mencipta sistem kotak pasir yang dijalankan secara bebas, seperti berikut:
vm.runInThisContext(kod, nama fail);
Kaedah ini digunakan untuk mencipta ruang berjalan kotak pasir bebas Kod dalam kod boleh mengakses objek global luaran, tetapi tidak boleh mengakses pembolehubah lain
Dan kod itu dikongsi secara dalaman dan luaran
var vm = memerlukan("vm");
var p = 5;
global.p = 11;
vm.runInThisContext("console.log('ok', p)");//Paparan 11
di bawah global
vm.runInThisContext("console.log(global)"); // Paparan global
console.log(p);// Paparan 5
vm.runInContext(kod, kotak pasir);
Kaedah ini digunakan untuk mencipta ruang larian kotak pasir bebas akan dihantar sebagai pembolehubah global ke dalam kod, tetapi tiada pembolehubah global
Keperluan SandBox ialah SandBox yang dicipta oleh kaedah vm.createContext()
var vm = memerlukan("vm");
var util = memerlukan("util");
tetingkap var = {
p: 2,
vm: vm,
konsol: konsol,
memerlukan: memerlukan
};
var p = 5;
global.p = 11;
vm.createContext(window);
vm.runInContext('p = 3;console.log(typeof global);', window); // global tidak ditentukan
console.log(window.p);// ditukar kepada 3
console.log(util.inspect(window));
vm.runInNewContext(kod, kotak pasir, opt);
Kaedah ini sepatutnya sama seperti runInContext, tetapi tanpa langkah mencipta sandBox
Bandingkan
Situasi yang lebih kompleks
Apakah yang akan berlaku jika runInThisContext dilaksanakan dalam runInContext objek global siapa yang mengakses runInThisContext?
Bagaimana kod berikut akan dilaksanakan?
var vm = memerlukan("vm");
var util = memerlukan("util");
tetingkap var = {
p: 2,
vm: vm,
konsol: konsol,
memerlukan: memerlukan
};
window.global = tingkap;
var p = 5;
global.p = 11;
vm.runInNewContext('p = 3;console.log(typeof global);require('vm').runInThisContext("console.log(p)");', window);
Kod di dalam runInThisContext boleh mengakses objek global luaran, tetapi sebenarnya tiada objek global di luar (walaupun ada, ia pada asasnya bukan objek global). Ingat bahawa runInThisContext hanya boleh mengakses objek global teratas
Keputusan pelaksanaan adalah seperti berikut
objek (wujud global)
11 (p global teratas)