在javascript中传递函数哪种方式更好?

在javascript中传递函数哪种方式更好?,javascript,node.js,Javascript,Node.js,如果我有3个js文件,如下所示: file1.js this.functionName = function(params) { //do something}; file2.js function fucntionName(params) { //do something }; module.exports = { functionName }; 然后在第三个js文件中,我可以要求两个文件的一个对象,并调用其中定义的两个函数;例如,如果我在index.js中调用它们

如果我有3个js文件,如下所示:

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

两者之间的区别是什么?首选哪一个

引自《华盛顿邮报》:

  • 在节点模块的顶级代码中,“this”相当于module.exports
因此,2可能看起来相当。但是,它们不是-在第二个示例中,您正在更改“module.exports”引用的对象。这是很危险的,因为您之前对同一模块内“module.exports”先前引用的原始对象所做的任何修改(感谢Kevin让我知道这不清楚)在需要时将不再可用。将来,如果有人想使用另一种方法添加函数,并在重新分配之前使其可用,他们可能会发现自己无法访问该函数,同时拥有一些外观正确的代码

此外,如果你相信第二种方法也有同样的效果,你可能会想做如下事情:

module.exports = {
     functionName1
};
// code, code, code
module.exports = {
     functionName2
};
module.exports.functionName = function(params) { 
    //do something
};
这显然会剥夺您对原始
functionName1
方法的访问权

当然,您可以同时将这两个函数添加到新对象中,但如果它们在您的范围内不可用(例如,它们已在另一个函数中定义),该怎么办?在函数可用时,您仍然必须使用第1个方法

这两种方法显然都有效。我推荐第一个,因为它对我来说既清晰又不容易出错

但是

由于
依赖于上下文,请将其全部放在一起,并坚持使用
模块.exports
。你最终会得到这样的结果:

module.exports = {
     functionName1
};
// code, code, code
module.exports = {
     functionName2
};
module.exports.functionName = function(params) { 
    //do something
};


(如果您关心的是将声明的函数关联起来)

如果您将ES6与Babel一起使用,那么使用
导出
语法会更简洁。也就是说,如果要直接引用函数,如下所示:

const fName = function(){
  /* do stuff here */
}
export default fName;
或者,如果您希望导出多个函数而不必在
模块中手动分配它们。导出
,则可以执行以下操作:

export const fName2 = function(){ /* do stuff */ }
因此,您可以直接导入第一个,然后通过分解导入第二个:

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

希望这是有帮助的

您是说修改
模块。第二个示例中的导出
可能会影响使用
require
拉入的其他无关模块?听起来你就是这么说的。。。如果不是,你的意思是在那个模块内,那么是的,我想这可能发生,但是。。。这就像说不要使用变量,因为您可能会意外地重用它们。不,我是说这会影响对“module.exports”对象上相同模块中可用的方法的访问,但在其重新分配之前。这不像说“不要使用变量,因为您可能会重用它们”,因为这里的根本问题不是修改了“module.exports”,而是更改了返回到所需模块的对象。如果我将自己的函数添加到“module.exports”中,我希望它在需要模块时可用。。。。嗯。是的,那就像说不要使用变量,因为你可能会忘记并重用它们。。。。嗯。不,那就像说不要给自己带来不必要的麻烦,因为半年前你决定替换引用对象是个聪明的主意。