出口与此之间的差异

时间:2014-02-18 23:48:39

标签: node.js requirejs

我在一些模块中看到他们使用modules.exports.something = ()->exports.something = ()->

在其他时候,this.something = ()->已完成。

显然会导致相同的行为。这个比那个好吗? this引用exports对象或类似内容吗?

1 个答案:

答案 0 :(得分:2)

exportsmodule.exports通常存在于提供某种模块加载系统的环境中。例如,Node.js使用CommmonJS模块系统。 RequireJS提供AMD风格的系统。在浏览器中加载的网页不会另外加载某种模块系统(如RequieJS),也不会定义exportsmodule.exports。如果您确实有一个模块系统并且想要导出值,通常情况下您要将要导出的内容分配给exportsmodule.exports或这些对象上的字段。< / p>

this所指的内容高度依赖于上下文。如果您创建仅包含console.log(this)的文件并使用Node.js运行它,您将看到{}输出到控制台。如果您在Chrome中加载的空白HTML页面中尝试相同操作,则会看到thiswindow对象。因此,在浏览器中,在最外层范围内分配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}}的第一个参数。