SivaDotRender
SivaDotRender

Reputation: 1651

Use of anonymous functions in nodejs

Is there a use for anonymous functions when writing a nodejs module. I understand that we use anonymous function to limit the scope of the variables/functions used to a specific module. However, in nodejs, we use modules.exports to made a function or variable available outside the module, hence shouldn't an anonymous function be unnecessary?

The reason I ask this is because popular node modules (like async.js) extensively use anonymous functions.

Example with anonymous function

1) test_module.js

(function(){

var test_module = {}; 
var a = "Hello";
var b = "World";

test_module.hello_world = function(){

    console.log(a + " " + b);

};

module.exports = test_module;


}());

2) test.js

var test_module = require("./test_module");

test_module.hello_world();


try {   
    console.log("var a is " + a + "in this scope");
}
catch (err){

    console.log(err);
}

try {   
    console.log("var a is " + b + "in this scope");
}
catch (err){

    console.log(err);
}

Output:

Hello World
[ReferenceError: a is not defined]
[ReferenceError: b is not defined]

Example without anonymous function

1) test_module2.js

var test_module = {}; 
var a = "Hello";
var b = "World";

test_module.hello_world = function(){

    console.log(a + " " + b);

};

module.exports = test_module;

2) test2.js

var test_module = require("./test_module2");

test_module.hello_world();


try {   
    console.log("var a is " + a + "in this scope");
}
catch (err){

    console.log(err);
}

try {   
    console.log("var a is " + b + "in this scope");
}
catch (err){

    console.log(err);
}

Output:

Hello World
[ReferenceError: a is not defined]
[ReferenceError: b is not defined]

Upvotes: 3

Views: 6880

Answers (1)

Mulan
Mulan

Reputation: 135416

You absolutely DO NOT need the anonymous function

Node guarantees you a clean "namespace" to work in with each file

The only things "visible" from each file/module are things that you explicitly export using module.exports


Your test_module2.js is much preferred though I would still make a couple changes. Most notably, you don't have to define myModule as an object in your file. You can think of the file as a module already.

test_module3.js

var a = "Hello";
var b = "World";

function helloWorld() {
  console.log(a, b);
}

exports.helloWorld = helloWorld;

Upvotes: 9

Related Questions