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]
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]
Share
Improve this question
edited Apr 7, 2015 at 15:47
SivaDotRender
asked Apr 7, 2015 at 13:02
SivaDotRenderSivaDotRender
1,6514 gold badges23 silver badges40 bronze badges
1
-
4
Node.js modules provide encapsulation them-selves. So there is no need to wrap assignment of
module.exports
this way. You might need it if you have nested classes. But that fact itself would actually hint to wrap this nested class into another module... – Kirill Slatin Commented Apr 7, 2015 at 13:11
1 Answer
Reset to default 9You 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;