我有一个像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"
任何指针都将非常感激!
答案 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不提供在浏览器中隐式存储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实现了一些目标:
- 它保留顶级变量(使用
var
,const
或let
定义)作用于模块而不是全局对象。- 它有助于提供一些实际上特定于模块的全局变量,例如:
- 实施者可用于从模块中导出值的
module
和exports
个对象。- 便利变量
__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();
现在x
在global
对象上定义,因此在任何模块中都“神奇地”可用。