2015-04-07 8 views
3

Существует ли использование анонимных функций при написании модуля nodejs. Я понимаю, что мы используем анонимную функцию для ограничения объема переменных/функций, используемых для конкретного модуля. Однако в nodejs мы используем modules.exports, чтобы сделать функцию или переменную доступной вне модуля, следовательно, не должна ли быть анонимной функция ненужной?Использование анонимных функций в nodejs

Причина, по которой я прошу об этом, состоит в том, что популярные модули узлов (например, async.js) широко используют анонимные функции.

Пример с анонимной функции

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

Выход:

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

Пример без анонимной функции

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

Выход:

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

Узел.js-модули обеспечивают инкапсуляцию самих себя. Поэтому нет необходимости обертывать назначение 'module.exports' таким образом. Возможно, вам понадобится, если у вас есть вложенные классы. Но сам этот факт на самом деле намекнул бы на перенос этого вложенного класса в другой модуль ... –

ответ

8

Вы абсолютно НЕ нужны анонимные функции

Node гарантирует вам чистое "пространство имен" для работы с каждым файлом

Единственное, что «видимые» из каждого файла/модуля вещи, которые вы явно экспорт с использованием module.exports


Ваш test_module2.js является наиболее предпочтительным, хотя я бы еще сделать пару изменений. В частности, вам не нужно определять myModule как объект в вашем файле. Вы можете думать о файле как о модуле.

test_module3.js

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

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

exports.helloWorld = helloWorld; 
+1

И любые объекты, назначенные как свойства объекта 'global'. – Matt

+0

@MS_SL Я вежливо прошу вас удалить свой комментарий. Не упоминайте мне «global» в node.js. Я не хочу даже намека на рекомендацию его использования в контексте моих ответов. Честно говоря, я бы предпочел, чтобы люди даже не знали, что это существует в node.js. – naomik

+1

Благодарим вас за ответ. Мне было любопытно, потому что я использовал популярный модуль узла, который использует анонимные функции. Теперь я понимаю, что причина этого в том, что модуль может использоваться как в узле, так и в интерфейсе JS (с использованием тега скрипта). – SivaDotRender

-1

Из моего небольшого опыта в разработке веб-приложений с использованием nodejs, нет абсолютно никакой необходимости экспортировать анонимную функцию!

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – KeatsPeeks

+0

@SivaDotRender Я вижу –

Смежные вопросы