gpt4 book ai didi

javascript - 模块导出习惯用法之间的区别

转载 作者:行者123 更新时间:2023-12-03 10:47:53 25 4
gpt4 key购买 nike

注意:关于类似问题的评论,我想指出,我对 module.exportsexports 之间的区别不感兴趣。相反,我在这个问题上的重点是导出一个函数(在调用它时)创建一个带有我们希望共享的函数的对象与直接将这些函数分配为 exports 对象的属性之间的区别。

我想了解以下两种在 JavaScript 中导出模块函数(并隐藏本地状态)的方法之间的区别:

方式1

var x = 0;

function get() {return x;}

function set(_x) {x = _x;}

exports.get = get;
exports.set = set;

方式2

module.exports = function () {
var x = 0;

function get() {return x;}

function set(_x) {x = _x;}

return {get:get, set:set};
};

(请注意,在方式2中,我必须分配给module.exports,分配给exports不起作用)。

方式1中的代码使用方式是:

var gs = require('./get-set-a.js');

console.log(gs.get());
gs.set(100);
console.log(gs.get());

方式2中的代码使用方式是:

var gs = require('./get-set-b.js')();

console.log(gs.get());
gs.set(100);
console.log(gs.get());

当从命令行运行时,在 node.js 下我得到相同的结果。

我应该注意方式1方式2之间有什么区别吗?它们是否适合不同的用例?如果不是,哪个更惯用?

最佳答案

第二个允许您运行模块的多个“实例”,第一个则不允许。

<小时/>

使用第一种方法

a.js

var gs = require('./get-set-a.js');

gs.set(100);
console.log(gs.get()); // 100;

require('./b');

b.js

var gs = require('./get-set-a.js');

console.log(gs.get()); // 100;

使用第二种方法

a.js

var gs = require('./get-set-a.js')();

gs.set(100);
console.log(gs.get()); // 100;

require('./b');

b.js

var gs = require('./get-set-a.js')();

console.log(gs.get()); // 0;
<小时/>

要完全清楚的是,多实例并不是因为您分配给module.exports,而不是exports ;这是因为你的初始化程序每次调用时都会返回一个新的闭包。您只需导出就可以实现多个实例

get-set-b.js

exports.create = function () {
var x = 0;

function get() {return x;}

function set(_x) {x = _x;}

return {get:get, set:set};
};

c.js

var gs = require('./get-set-b.js').create();

console.log(gs.get()); // 0
gs.set(100);
console.log(gs.get()); / 100

d.js

var gs = require('./get-set-b.js').create();

console.log(gs.get()); // 0
gs.set(100);
console.log(gs.get()); // 100

关于javascript - 模块导出习惯用法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28503206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com