节点赢得';不要运行来自雄辩的Javascript的示例,v8将运行。什么';怎么回事?

节点赢得';不要运行来自雄辩的Javascript的示例,v8将运行。什么';怎么回事?,javascript,node.js,v8,Javascript,Node.js,V8,下面的函数是从雄辩的Javascript第10章一字不差地复制而来的,它与v8解释器完美地运行。然而,它在节点中爆炸,对象weekDay未定义。它在本书提供的沙盒解释器中也运行良好。有人能解释一下怎么回事吗 (function(exports) { var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; exports.name

下面的函数是从雄辩的Javascript第10章一字不差地复制而来的,它与v8解释器完美地运行。然而,它在节点中爆炸,对象weekDay未定义。它在本书提供的沙盒解释器中也运行良好。有人能解释一下怎么回事吗

(function(exports) {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];

  exports.name = function(number) {
    return names[number];
  };
  exports.number = function(name) {
    return names.indexOf(name);
  };
})(this.weekDay = {});

console.log(weekDay.name(weekDay.number("Saturday")));

这是因为节点模块中的
未指向全局对象。它指向该模块的导出。这意味着
weekDay
不能作为全局变量使用

// ---------v
console.log(exports.weekDay.name(weekDay.number("Saturday")));


要获得节点模块外观的广泛(简化)视图,基本上需要将代码放入IIFE中

如果这是你的模块

this.foo = "bar"
console.log(exports.foo); // "bar"
它之所以有效是因为它实际上是这样的

var exports = {};    // Generated by Node
(function(exports) { // Generated by Node

    this.foo = "bar"
    console.log(exports.foo); // "bar"

}).call(exports, exports); // Generated by Node
其中额外的代码行由节点生成。您可以看到,它创建了一个对象,将其用作IIFE函数的
this
值和
exports
参数


还有一点是他们传递给IILife的,但这显示了基本思想。

你是什么意思,它使用V8而不是node运行?你们有独立的V8引擎外壳吗?正确。这是一个教室环境;学生使用节点和定制的v8外壳。
var exports = {};    // Generated by Node
(function(exports) { // Generated by Node

    this.foo = "bar"
    console.log(exports.foo); // "bar"

}).call(exports, exports); // Generated by Node