下面的函数是从 Ch 中逐字复制的。 Eloquent Javascript 的 10 个,它与 v8 解释器完美运行。但是,它在 undefined object weekDay 的 Node 中爆炸。它在本书提供的沙箱解释器中也运行良好。谁能解释一下这是怎么回事?
(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")));
最佳答案
这是因为 Node 模块中的 this
没有指向全局对象。它指向该模块的 exports
。这意味着 weekDay
不能用作全局变量。
// ---------v
console.log(exports.weekDay.name(weekDay.number("Saturday")));
或
// ---------v
console.log(this.weekDay.name(weekDay.number("Saturday")));
为了更广泛(和简化)地了解 Node 模块的外观,它基本上是获取您的代码并将其放入 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.js 生成。您可以看到它创建了一个对象,它同时用作 IIFE 函数的 this
值和 exports
参数。
他们还向 IIFE 传递了更多内容,但这显示了基本思想。
关于javascript - Node 不会运行来自 Eloquent Javascript 的示例,v8 会。这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29335508/