最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Use of anonymous functions in nodejs - Stack Overflow

programmeradmin2浏览0评论

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
Add a ment  | 

1 Answer 1

Reset to default 9

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;
发布评论

评论列表(0)

  1. 暂无评论