Javascript将变量传递给require模块

时间:2017-06-30 23:50:17

标签: javascript

我有一个像foo.js这样的文件

var foo = function() {
    console.log(x + 'foo'); // I want my module that require/import to pass into this file.
};

exports.foo = foo;

然后我有另一个文件main.js,我想从这里将变量传递给foo.js。有可能吗?

var x = 'Hi, '; // I want to pass this to the module foo.js. Is it possible?
var foo = require('./foo');

foo.foo(); // I want to see "Hi, foo"

任何指针都将非常感激!

3 个答案:

答案 0 :(得分:1)

你可以做这样的事情

// foo.js
module.exports = {
    foo: function (x) {
        console.log(x + 'foo');
    }
}

// main.js
var foo = require('./foo');
var x = 'Hi';
foo.foo(x);

答案 1 :(得分:0)

为什么不让foo方法接受变量,以便将x传递到像foo.foo()这样的foo.foo(x)

答案 2 :(得分:0)

了解NodeJS范围和模块

NodeJS不提供在浏览器中隐式存储window等变量的全局对象。在浏览器中,var x = "Hi";可以隐式地将x绑定到另一个函数可以访问的window

  

所有模块都提供这些对象。其中一些对象实际上并不在全局范围内,而是在模块范围内 - 这将被注意到。

The NodeJS documentation说。它进一步说明了全球global object

  

在浏览器中,顶级范围是全局范围。这意味着在浏览器var something内将定义一个新的全局变量。在Node.js中,这是不同的。顶级范围不是全球范围; Node.js模块中的var something将是该模块的本地。

The NodeJS documentation on modules

  

模块包装器

     

在执行模块代码之前,Node.js将使用如下所示的函数包装器来包装它:       (function(exports,require,module,__ filename,__ dirname){       //模块代码实际上就在这里       });

     

通过这样做,Node.js实现了一些目标:

     
      
  • 它保留顶级变量(使用varconstlet定义)作用于模块而不是全局对象。
  •   
  • 它有助于提供一些实际上特定于模块的全局变量,例如:      
        
    • 实施者可用于从模块中导出值的moduleexports个对象。
    •   
    • 便利变量__filename__dirname,包含模块的绝对文件名和目录路径。
    •   
  •   

这就是为exports分配值的原因。

解决方案

模块工厂

您应该返回一个包装函数,该函数接受在任何

中提供它的参数

<强> foo.js:

// Export a function that establishes a new scope providing "x"
module.exports = function(x) {
    return {
        foo: function() {
            console.log(x + 'foo'); // I want my module that require/import to pass into this file.
        };
    };
};

<强> main.js:

var x = "Hi",
    // call that factory function passing "x"
    foo = require("./foo")(x).foo;
foo();

请注意它使用module.exports,因为exports = ...单独只会替换NodeJS包裹模块代码的函数参数中的引用(请参阅上面的链接),而module.exports = ...替换导出模块的属性

请参阅NodeJS docs on the difference

  

它允许使用快捷方式,以便module.exports.f = ...可以更简洁地写为exports.f = ...。但是,请注意,与任何变量一样,如果为exports分配了新值,则不再绑定到module.exports

     

[...]

x分配给global

这只是为了完整性,不要这样做。

  • 这将使得更难理解哪些参考文献来自哪里。
  • 您可能会意外地覆盖其他模块定义的其他全局变量。

<强> main.js:

var x = "Hi",
    foo = require("./foo");
global.x = x;
foo();

现在xglobal对象上定义,因此在任何模块中都“神奇地”可用。