Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript将变量传递给require模块_Javascript - Fatal编程技术网

Javascript将变量传递给require模块

Javascript将变量传递给require模块,javascript,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 f

我有一个类似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"

任何指点都将不胜感激

为什么不让
foo
方法接受变量,以便将
x
传递到
foo.foo()
类似
foo.foo(x)

您可以这样做

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

// main.js
var foo = require('./foo');
var x = 'Hi';
foo.foo(x);
理解NodeJS范围和模块 NodeJS不提供在浏览器中隐式存储变量(如
window
)的全局对象。在浏览器中,
var x=“Hi”可以将
x
隐式绑定到另一个函数可以访问的
窗口

这些对象在所有模块中都可用。这些对象中的一些实际上不在全局范围内,而是在模块范围内——这将被注意到

说。它还说,在全球范围内:

在浏览器中,顶级作用域是全局作用域。这意味着在浏览器
var中,将定义一个新的全局变量。在Node.js中,这是不同的。顶层范围不是全局范围
var Node.js模块中的某些内容将是该模块的本地内容

:

模块包装器 在执行模块代码之前,Node.js将使用如下所示的函数包装器对其进行包装: (函数(导出、要求、模块、文件名、目录名){ //模块代码实际上就住在这里 });

通过这样做,Node.js实现了以下几点:

  • 它将顶级变量(用
    var
    const
    let
    定义)的范围限定在模块而不是全局对象
  • 它有助于提供一些实际特定于模块的全局变量,例如:
    • 模块
      导出实现者可用于从模块导出值的对象
    • 方便变量
      \uuu filename
      \uuu dirname
      ,包含模块的绝对文件名和目录路径
这就是为什么要为导出指定一个值

解决 模块工厂 您应该返回一个包装函数,该函数接受以任何形式提供它的参数

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.
        };
    };
};
var x = "Hi",
    // call that factory function passing "x"
    foo = require("./foo")(x).foo;
foo();
var x = "Hi",
    foo = require("./foo");
global.x = x;
foo();
main.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.
        };
    };
};
var x = "Hi",
    // call that factory function passing "x"
    foo = require("./foo")(x).foo;
foo();
var x = "Hi",
    foo = require("./foo");
global.x = x;
foo();
注意,它使用
module.exports
,因为
exports=…
单独将仅替换NodeJS围绕模块代码的函数参数中的引用(请参见上面的链接),而
module.exports=…
替换导出模块的属性

见:

它允许一个快捷方式,因此
module.exports.f=…
可以更简洁地编写为
exports.f=…
。但是,请注意,与任何变量一样,如果将新值分配给
导出
,它将不再绑定到
模块。导出

[……]

x
分配给
global
这只是为了完整性,不要这样做。

  • 这将使人们更难理解哪些参考文献来自哪里
  • 您可能会意外地用其他模块定义的相同名称覆盖其他全局变量
main.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.
        };
    };
};
var x = "Hi",
    // call that factory function passing "x"
    foo = require("./foo")(x).foo;
foo();
var x = "Hi",
    foo = require("./foo");
global.x = x;
foo();

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

这可能会对您有所帮助,但您是否希望将方法传递到另一个文件?谢谢大家的评论!如果你能指出OP的方法不起作用的原因,并且你的方法和OP的方法加上论点在技术上没有区别,那就太好了。请不要用带相关信息的反问题回答问题。最好指出错误所在,以及节点按其工作方式工作的原因。谢谢。我在问OP是否有不将变量传递给函数的特定原因,同时也提供了示例。我这样做是为了防止在评论中发布问题,然后在得到澄清后在回答中重新编写和重新发布相同的内容。除了覆盖和管理问题外,在使用“全局”方法时,还有什么更重要的问题需要我注意吗?我走上了一条道路,这是唯一的解决办法,在我的情况下,但我想确保我知道所有的下跌方面。谢谢