Javascript 关于Node.js'的混淆;文件需要未导出任何内容的模块时的行为
我对Node.js'Javascript 关于Node.js'的混淆;文件需要未导出任何内容的模块时的行为,javascript,node.js,module,Javascript,Node.js,Module,我对Node.js'require()。然而,有些行为对我来说毫无意义 假设我有两个非常简单的单行文件a.js和b.js 在a.js中: require('./b.js'); console.log("testing"); 在b.js中: require('./b.js'); console.log("testing"); 如果我在终端中运行节点a.js,下面是记录的内容: $ node a.js testing. 这意味着,只要需要一个文件/模块,请求文件的内容就会暴露给发出请求的文
require()。然而,有些行为对我来说毫无意义
假设我有两个非常简单的单行文件a.js
和b.js
在a.js
中:
require('./b.js');
console.log("testing");
在b.js
中:
require('./b.js');
console.log("testing");
如果我在终端中运行节点a.js
,下面是记录的内容:
$ node a.js
testing.
这意味着,只要需要一个文件/模块,请求文件的内容就会暴露给发出请求的文件(,对吗?)
现在我将a.js
修改为:
require('./b.js');
testFunc(1, 2);
和b.js的链接:
var testFunc = function(a, b) {
var result = a + b;
return result;
}
然后再次在终端中运行节点a.js
:
$ node a.js
/demo/a.js:3
testFunc(1, 2);
^
ReferenceError: testFunc is not defined
......
这是怎么回事?显然,在第一个示例中,通过要求b.js
,a.js
可以访问b.js
中的内容。但是,在第二个示例中,b.js
中定义的函数完全不可访问,这一点在ReferenceError:testFunc未定义
中很明显。这里有什么诀窍
是因为
require()
只运行所需的脚本,而没有将其内容实际公开给请求文件吗?因此,为了使用其他模块的内容,必须使用module.exports
?公开该模块。在第一种情况下,a.js
不会公开任何内容。在nodejs中,必须将导出的值显式存储到变量中
也就是说,当您需要一个模块时,将执行最高的作用域,以创建将要导出的内容。这就是为什么您会看到正在执行console.log
如果要从b.js
导出某些内容,必须执行以下操作:
module.exports = {
testFunc: testFunc
}
在a.js中
var b = require('./b.js')
b.testFunc(1, 2)
换句话说,与许多语言不同,当需要模块时。没有符号附加到全局作用域,因此如果不明确地将testFunc
定义到模块btestFunc
,nodejs将永远不会知道什么是testFunc
。您的理解有缺陷
“文件内容向发出请求的文件公开”通常不公开,仅公开module.exports
节点模块在其自己的作用域内运行,因此模块中的任何代码都无法在其外部访问
您可以看到控制台日志,因为所有控制台消息都指向相同的输出,在本例中为终端
这类似于console.log()
消息在浏览器中的工作方式。即使下面的代码在iframe
中运行,并且与主页分开,但是iframe
和主窗口中的控制台消息都指向开发工具控制台
console.log(“哇”)代码>中可以找到一个很好的答案
当您需要节点JS中的脚本时(在本例中为b.JS
),除非将其导出,否则它无法实际处理代码——当然,除非您要求脚本执行操作
例如:
a.js
'use strict';
let b = require('./b.js');
let result = b.testFunc(1, 4);
console.log(result);
'use strict';
module.exports.testFunc = function(a, b) {
let result = a + b;
return result;
}
console.log(this.testFunc(5,5));
b.js
'use strict';
let b = require('./b.js');
let result = b.testFunc(1, 4);
console.log(result);
'use strict';
module.exports.testFunc = function(a, b) {
let result = a + b;
return result;
}
console.log(this.testFunc(5,5));
我不知道这个问题与ES6或express有什么关系。