将导出传递给匿名函数的影响是什么?

时间:2016-11-17 06:52:52

标签: javascript node.js

我正在查看node-etherdream库的代码,在主模块中我看到了这个:

(缩写):

(function(ns) {
   /// a bunch of code

})(exports);

我从未见过将exports传递给这样的匿名函数,也没有在此代码中的任何位置看到module.exports。然而,此文件与任何其他模块一样reuire

有人可以向我解释exports对此的使用吗?

2 个答案:

答案 0 :(得分:1)

导出是可以将变量设置为的特殊对象。 所以在这个例子中,当函数执行时,它传递了这个对象的导出。

如果你想导出一些变量,可以在ns变量(exports)中设置它,就像这样:

(function(ns) {
/// a bunch of code
    ns.func1 = function(){}

    ns.func2 = function(){}

    ns.age = 20
})(exports);

当您需要来自其他文件的文件时,您将可以访问此变量func1,func2和age:

var o = require('file.js')
o.func1();
o.func2();
o.age // => 20

答案 1 :(得分:0)

您可以查看以下Immediately Invoked Function Expression (IIFE)发音 iffy),其中exports作为参数传递给下面函数的ns参数。

(function(ns) {
   /// a bunch of code

})(exports);

当您查看代码EtherDream内部时,将使用所需的所有方法创建对象,并最终绑定到ns参数,其中ns将作为exports传递给以下行相当于exports.EtherDream = EtherDream;

(function(ns) {
   /// a bunch of code


   ns.EtherDream = EtherDream;

})(exports);

如果您仍然不了解IIFE的工作原理及其参数,可以执行下面的示例iife摘要。

(function(ns) {
       console.log(ns);
       
})(10); // argument passed as 10 to ns


// This is same as below global scope method

function another(ns) {
  console.log(ns);
}

another(10);