Javascript——在Node.js与浏览器中导出

Javascript——在Node.js与浏览器中导出,javascript,node.js,Javascript,Node.js,我正试图从模块部分中雄辩的Javascript运行这个简短的程序 var weekDay = function() {}(); (function(exports) { var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; exports.name = function(number) { return names[number]; }

我正试图从模块部分中雄辩的Javascript运行这个简短的程序

var weekDay = function() {}();

(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")));
正确的输出应该是
/->星期六

它在浏览器中工作得非常好。但是,当我尝试在节点解释器中运行它时,会出现以下错误:

TypeError: Cannot read property 'name' of undefined
我只能假设它与Node处理exports关键字的方式有关。有人能帮我至少大致了解一下这种行为吗?

在node.js这一行:

var weekDay = function() {}();
只生成一个未定义的变量weekDay,因为它所做的只是定义一个带有空主体的函数(代码中的
{}
),然后立即运行它。因为主体是空的(最重要的是,没有返回语句),所以它产生未定义的结果

实现您想要的方法是将整个定义放在此函数中,并定义要公开的内容,如下所示:

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

  var name = function(number) {
    return names[number];
  };
  var number = function(name) {
    return names.indexOf(name);
  };

  return {
    number: number,
    name: name
  }

}();


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

将第一行更改为
var weekDay={}当你调用你的iLife时,只需在工作日将你在第一行中创建的内容放入其中。

Nir Levy的答案是正确的,但我也发布了这个答案,因为你在谈论模块。这就是如何为代码片段创建模块的方法

//create your module like this and put this module in a separate file (ex. weekDay.js)
var weekDay = (function() {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

  var name = function(number) {
    return names[number];
  };
  var number = function(name) {
    return names.indexOf(name);
  };

  return {
    number: number,
    name: name
  } 
})(); //it's a self executing function

//exporte module
module.exports = weekDay



//to get your module (in another file)
var weekDayModule = require('./weekDay'); //path to module

console.log(weekDayModule.name(weekDayModule.number('Saturday')));

可能是这个。工作日。试着把它改为工作日,第一行也没用。只需在工作日保持
var
。在节点模块中,
不是
全局
,而是
导出
@AlexanderO'Mara,您介意澄清一下这一点吗?在节点模块中,
是由节点预定义的
导出
对象。如果不清楚,请随时询问更多信息;)这个解决方案实际上或多或少是书中使用的原始工作示例。Haverbeke对我写的另一个版本这样说:“对于更大的模块,在函数末尾将所有导出的值收集到一个对象中会变得很尴尬,因为许多导出的函数可能很大,而您更愿意将它们写到其他地方。一个方便的替代方法是声明一个对象(通常称为导出)并在定义需要导出的内容时向其添加属性。“@ooronning:检查我的答案,这是在单独文件中导出模块的常用方法