Reputation: 1651
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
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