3

这是 jasmine 2.0.0 独立项目中的一个函数:

function getJasmineRequireObj() {
    if (typeof module !== "undefined" && module.exports) {
        return exports;
    } else {
        window.jasmineRequire = window.jasmineRequire || {};
        return window.jasmineRequire;
    }
}

我想如果我使用标准的 require 方法,模块属性将被定义。当我使用 VM 模块加载此文件时,模块全局属性未定义:

var fs = require('fs');
var vm = require('vm');
var jasmineFile = fs.readFileSync(__dirname + '/jasmine.js');
vm.runInThisContext(src, jasmineFile);

这是 VM 模块的预期行为还是缺陷?

4

1 回答 1

14

这是预期的行为。您的代码在相同的上下文中进行评估,但不在相同的范围内,因此module未定义exports等等。你可以这样做:

var m = require('module')
var src = 'module.exports = 42'
var res = require('vm').runInThisContext(m.wrap(src))(exports, require, module, __filename, __dirname)
console.log(module.exports)

但这样做没有多大意义,因为它基本上就是require这样做的

于 2014-01-03T10:57:04.807 回答