Javascript - export to Node.js against browser

I am trying to run this short program from Eloquent Javascript in the "Modules" section.

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

The correct conclusion should be // -> Saturday.

It works fine in the browser. However, when I try to run it in the Node interpreter, I get this error:

TypeError: Cannot read property 'name' of undefined

I can only assume that it has something to do with how Node handles the export keyword. Can someone help me get at least a rough understanding of this behavior?

+4
source share
3 answers

Nir Levy's answer is correct, but I also posted this answer because you were talking about modules. This is how you create the module of your code snippet.

//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 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')));
+3

node.js:

var weekDay = function() {}();

undefined weekDay, , , en empty body ({} ) . (, , return), undefined

, , - , , :

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")));
+2

Change the first line to var weekDay = {};, and when you call iife, just insert the weekDay in it that you created on the first line.

0
source

Source: https://habr.com/ru/post/1621901/


All Articles