关于underscore源码的一点小疑问

发布于 2022-09-03 09:17:33 字数 478 浏览 18 评论 0

在源码中有这样一段:

if (typeof exports !== 'undefined') {
    if (typeof module !== 'undefined' && module.exports) {
      exports = module.exports = _;
    }
    exports._ = _; // 要么是exports._ = _,要么是module.exports = _
} else {
  root._ = _;
}

我的疑问是exports和module.exports任意用一个就行了,这两个不会有循环引用的问题么?

underscore

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浅笑轻吟梦一曲 2022-09-10 09:17:33

module.exportsexports的用途是不一样的,具体表现为如果输出的对象是一个整体对象我们使用module.exports,如果是对象中的属性单个导出则使用exports

// 整体导出
module.exports = {name:'wason',age:24,sex:'male'};
//单个导出
exports.name = 'wason';
exports.age = 24;
exports.sex = 'male';
梦醒灬来后我 2022-09-10 09:17:33

在初始化的时候, exports 和 module.exports指向的是同一个object, 所以如果你: console.log(module.exports === exports); 会输出 true.

require 导入时, 或者说module导出时, 导出的是module.exports所指向的object, 所以会出现一下情况:

// a.js
exports = "a";

// b.js
var a = require("./a"); // {} -> 因为module.exports依然指向{}
// 或者你只改变了exports的reference, 但没有修改module.exports的话, 也会导致一样的问题, 这也是为什么通常不用exports做整体导出的原因~ 因为最终导出的其实是module.exports所指向的.

所以如果更改为:

// a.js
module.exports = "a";

// b.js
var a = require("./a"); // "a"

但是如果两者始终指向同一个object, 那么如何assign都没有关系的, 比如:

// a.js
module.exports.a = "A";
exports.b = "B";

// b.js
var a = require("./a");
a.a === "A";
a.b === "B";

所以通常会一同使用module.exports, exports, 来确保它们指向同一个object, 这样在之后的使用中也会比较一致, 且exports可以作为module.exports的一个shortcut来使用~

其实为了防止module, exports因为element id的原因而出现误判, 所以这部分代码已经更新为:

  if (typeof exports != 'undefined' && !exports.nodeType) {
    if (typeof module != 'undefined' && !module.nodeType && module.exports) {
      exports = module.exports = _;
    }
    exports._ = _; // 主要是为了老node版本的module语法支持
  } else {
    root._ = _;
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文