javascript - Node 不会运行来自 Eloquent Javascript 的示例,v8 会。这是怎么回事?

标签 javascript node.js v8

下面的函数是从 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/

相关文章:

javascript - 如何使用 jQuery 屏蔽输入时保留后缀

javascript JSON 和 Array 元素,帮助我理解有关引号的规则

node.js - 如何在nodejs中将jwt token 到期时间设置为最大值?

node.js - 删除帖子及其所有通知和提要

javascript - Node.js 上的 V8 当前值是多少

javascript - DevTools 堆快照中的 __proto__ 是什么意思?

javascript - JavaScript和Haskell的函数组合

javascript - 通过上面的输入更改选择/选项通用文本

javascript - 隐藏具有指定类的最接近的 div

jquery - 如何在 jQuery 中检索 HTML 属性值?