>웹 프론트엔드 >JS 튜토리얼 >NodeJs_node.js의 VM 모듈에 대한 자세한 설명

NodeJs_node.js의 VM 모듈에 대한 자세한 설명

WBOY
WBOY원래의
2016-05-16 16:00:512124검색

VM이란 무엇인가요?

VM 모듈은 NodeJS의 핵심 모듈로, NodeJS의 require 메서드와 작동 메커니즘을 지원합니다. 때로는 VM 템플릿을 사용하여 몇 가지 특별한 작업을 수행할 수도 있습니다.

VM을 통해 JS를 즉시 컴파일하고 실행하거나 나중에 컴파일하고 저장하고 실행할 수 있습니다
VM 모듈에는 독립적으로 실행되는 샌드박스 시스템을 생성하기 위해 일반적으로 사용되는 세 가지 방법이 포함되어 있습니다.
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(code, sandBox);

이 방법은 독립적인 샌드박스 실행 공간을 만드는 데 사용됩니다. sandBox는 코드에 전역 변수로 전달되지만 전역 변수는 없습니다.

sandBox 요구사항은 vm.createContext() 메소드로 생성된 sandBox입니다

코드 복사 코드는 다음과 같습니다.

var vm = require("vm");
var util = require("util");

var 창 = {
피: 2,
VM: VM,
콘솔: 콘솔,
​ 요구하다: 요구하다
};

var p = 5;

global.p = 11;

vm.createContext(window);
vm.runInContext('p = 3;console.log(typeof global);', window); // 전역은 정의되지 않았습니다

console.log(window.p);// 3으로 변경

console.log(util.inspect(window));
vm.runInNewContext(code, sandbox, opt);

이 메소드는 runInContext와 동일해야 하지만 sandBox를 생성하는 단계가 없습니다

비교

더 복잡한 상황
runInThisContext가 runInContext에서 실행되면 어떤 일이 발생합니까? runInThisContext는 누구의 전역 개체에 액세스합니까?

다음 코드는 어떻게 실행되나요?

코드 복사 코드는 다음과 같습니다.

var vm = require("vm");
var util = require("util");

var 창 = {
피: 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으로 문의하세요.