Node不会从Eloquent Javascript运行示例,v8会.这是怎么回事?

Bri*_*uch 4 javascript v8 node.js

以下功能从Ch.逐字复制.10个Eloquent Javascript,它与v8解释器完美搭配.然而,它在Node中爆炸,对象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")));
Run Code Online (Sandbox Code Playgroud)

小智 5

这是因为this在Node模块中没有指向全局对象.它指向exports该模块.这意味着weekDay不能作为全局变量使用.

// ---------v
console.log(exports.weekDay.name(weekDay.number("Saturday")));
Run Code Online (Sandbox Code Playgroud)

要么

// ---------v
console.log(this.weekDay.name(weekDay.number("Saturday")));
Run Code Online (Sandbox Code Playgroud)

为了获得节点模块外观的广泛(和简化)视图,它基本上将您的代码放入IIFE中.

所以如果这是你的模块......

this.foo = "bar"
console.log(exports.foo); // "bar"
Run Code Online (Sandbox Code Playgroud)

它有效,因为它实际上是这样的......

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

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

}).call(exports, exports); // Generated by Node
Run Code Online (Sandbox Code Playgroud)

其中额外的代码行由Node生成.您可以看到它创建了一个对象,它将其用作IIFE函数的this值和exports参数.

还有一些他们传递给IIFE,但这显示了基本的想法.