我在一些模块中看到他们使用modules.exports.something = ()->
或exports.something = ()->
。
在其他时候,this.something = ()->
已完成。
显然会导致相同的行为。这个比那个好吗? this
引用exports
对象或类似内容吗?
答案 0 :(得分:2)
exports
和module.exports
通常存在于提供某种模块加载系统的环境中。例如,Node.js使用CommmonJS模块系统。 RequireJS提供AMD风格的系统。在浏览器中加载的网页不会另外加载某种模块系统(如RequieJS),也不会定义exports
和module.exports
。如果您确实有一个模块系统并且想要导出值,通常情况下您要将要导出的内容分配给exports
或module.exports
或这些对象上的字段。< / p>
this
所指的内容高度依赖于上下文。如果您创建仅包含console.log(this)
的文件并使用Node.js运行它,您将看到{}
输出到控制台。如果您在Chrome中加载的空白HTML页面中尝试相同操作,则会看到this
是window
对象。因此,在浏览器中,在最外层范围内分配this.foo
等同于分配给window.foo
,并且是在全局空间中声明foo
的方法。您有时会看到的代码是设计用于各种环境的代码,这些代码会根据运行的位置更改this
的值。类似的东西:
function factory() {
this.foo = function () {...};
this.bar = "q";
}
if (typeof exports !== 'undefined')
factory.call(exports); // CommonJS or AMD environment.
else if (typeof window !== 'undefined')
factory.call(window); // Browser.
else
factory.call(this); // Something else.
使用call
函数上的factory
方法,将this
factory
内的call
值设置为传递给{{1}}的第一个参数。