节点将不会运行Eloquent Javascript的例子,V8将。 这是怎么回事?

下面的函数逐字从Ch复制。 使用Javascript的10个,并且与v8解释器一起运行。 但是,它在Node中以对象weekDay未定义的方式popup。 它在本书提供的沙箱解释器中运行良好。 有人可以解释一下吗?

(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"))); 

这是因为this在Node模块中并不指向全局对象。 它指向该模块的exports 。 这意味着weekDay不可用作为全局variables。

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

要么

 // ---------v console.log(this.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 

额外的代码行由Node生成。 你可以看到它创build了一个它用作IIFE函数的this值和exports参数的对象。

还有一点他们也通过了IIFE,但这显示了基本的想法。