2016-09-23 2 views
-1

Если у меня есть 3 JS файлы следующим образом:Какой способ лучше передать функцию в javascript?

file1.js

this.functionName = function(params) { //do something}; 

file2.js

function fucntionName(params) { 
    //do something 
}; 

module.exports = { 
    functionName 
}; 

Затем в третьем Js файл, я могу потребовать объект из двух файлы и вызовы для двух функций, определенных в них; так, например, если я буду называть их в index.js

let file1 = require('/file1'); 
let file2 = require('/file2'); 

file1.functionName('some param'); 
file2.functionName('some param'); 

Какие различия между этими двумя и который является предпочтительным?

ответ

0

Первый иш

Как цитата из this поста:

  • В коде верхнего уровня в модуле Node, «этот» эквивалентно module.exports.

Поэтому 2 могут показаться эквивалентными. Но они не являются - во втором примере вы меняете объект, на который ссылается «module.exports». Это опасно, поскольку любые предыдущие изменения, которые вы внесли в исходный объект, ранее упомянутый «module.exports» в том же модуле (спасибо, что Kevin за то, что он сообщил мне, что это было неясно), больше не будет доступно при необходимости. В будущем, если кто-то захочет добавить функцию, используя другой метод, и сделать ее доступной до вашего повторного назначения, они могут оказаться неспособными получить к ней доступ при наличии правильного кода.

Кроме того - позволяя себе верить второй метод имеет тот же эффект, вы можете захотеть сделать что-то вроде:

module.exports = { 
    functionName1 
}; 
// code, code, code 
module.exports = { 
    functionName2 
}; 

Что будет, очевидно, лишить вас доступ к исходной functionName1 методы.

Конечно, вы можете добавить обе функции к новому объекту в одно и то же время, но что, если они просто недоступны в вашей области действия (например, они были определены внутри другой функции)? Вам все равно придется использовать 1-й метод в любом случае в то время, когда функция доступна.

Оба метода, очевидно, работают. Я рекомендую 1-й, поскольку для меня это более ясное и менее подверженное ошибкам.

Однако

С this это зависит от контекста, отбрось все это вместе и придерживаться module.exports.Вы будете в конечном итоге с чем-то вроде:

module.exports.functionName = function(params) { 
    //do something 
}; 

или

function mySimpleFunction(params){ 
    //do something 
} 
module.exports.functionName = mySimpleFunction; 

(в случае, если ваша проблема была с ассоциирования объявленной функции)

+0

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

+0

Нет, я говорю, что это повлияет на доступ к методам, доступным в том же модуле на объекте "module.exports", но до его переназначения. Это не похоже на то, что «не используйте переменные, поскольку вы можете их повторно использовать», поскольку основная проблема здесь заключается не в том, что «module.exports» изменен, но что объект, возвращенный требующему модулю, изменяется. Если бы я должен был добавить свою собственную функцию в «module.exports», я бы ожидал, что она будет доступна, когда потребуется модуль. –

+1

... uhm. да, тогда это похоже на то, что вы не используете переменные, потому что можете забыть и использовать их повторно. –

1

Если вы используете ES6 с Бабелем, это намного чище использовать синтаксис export. То есть, если вы хотите сослаться на функцию непосредственно, например:

const fName = function(){ 
    /* do stuff here */ 
} 
export default fName; 

Или, если вы хотите экспортировать несколько функций без необходимости вручную назначить их в module.exports, вы можете сделать это:

export const fName2 = function(){ /* do stuff */ } 

Итак вы можете импортировать первый непосредственно, а второй через деструктуризации:

import fName from './file1'; 
import { fName2 } from './file2'; 

Надежда это было полезно

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