这是一种好奇心的问题。
假设文件库.js如下:
function alpha(){
console.log("in alpha");
beta();
console.log("back in alpha");
}
function beta(){
console.log("in beta")
}
module.exports = {
alpha:alpha
}
当另一个文件需要这个库时,请说main.js然后从这个模块调用alpha函数,如下所示:
var lib = require("library.js")
lib.alpha();
//outputs:
//in alpha
//in beta
//back in alpha
然而,beta()函数并未真正导出。这是否意味着NodeJS在library.js文件中查找beta()?如果有人能够在技术细节上解释这个过程,那就太好了。
答案 0 :(得分:2)
它取决于函数的作用域,您始终可以从同一作用域或所有周围的作用域调用函数或变量。 Scope通常是一个函数Statement,它可能被全局Scope包围(在Browsers中,全局Scope是窗口)。您可以嵌套函数,内部函数可以访问自己的变量以及周围Scopes的变量。看一下这个例子:
xAxis: {
labels: {
useHTML:true,
style: {
width: 50 //where 50 is value in pixels
}
}
}
此范围始终存在,这意味着如果您将函数构建为另一个函数的公共成员,并从中调用私有成员。但如果你没有在正确的范围内,它就会失败。如果扩展对象的原型,则此行为很重要。
var varInGlobalScope = 'global'; // This is always accessible
var functionInGlobalNamespace = function () {
// This is accessible inside the function 'functionInGlobalNamespace'
// and all nested functions but not from the global Scope
var varInFunction = 'in function';
var functionInFunction = function () {
// This is accessible inside the function 'functionInFunction'
// but not from 'functionInGlobalNamespace' or the global Scope
var varInFunctionInFunction = 'in function in function';
console.log(varInFunctionInFunction); // works
console.log(varInFunction); // works
console.log(varInGlobalScope); // works
}
console.log(varInFunctionInFunction); // fails
console.log(varInFunction); // works
console.log(varInGlobalScope); // works
}
console.log(varInFunctionInFunction); // fails
console.log(varInFunction); // fails
console.log(varInGlobalScope); // works
现在出现了Node.js的"魔法" -part,因为如果你构建一个模块以在另一个模块或文件中需要它,你必须将所有可导出的东西放入特殊对象{{1} }。这基本上是一个由require函数返回的对象,但正如我们在这个函数的整个Scope之前的例子中所学到的那样。
在这个处理中还有一些其他方面可能很重要,但解释这些方面会让答案变得臃肿。
作为提示,您可以完美地使用它来实现私有功能,并且只为用户提供干净的界面。例如,将一个巨大的函数拆分成几个小块来维护一个干净的代码库。
答案 1 :(得分:1)
这是因为关闭和吊装而起作用的原因。
首先,nodejs围绕文件内容创建一个周围的块,如下所示:
(function (exports, require, module, __filename, __dirname) {
function alpha(){
console.log("in alpha");
beta();
console.log("back in alpha");
}
function beta(){
console.log("in beta")
}
module.exports = {
alpha:alpha
}
});
函数声明总是在代码执行之前解析,并始终提升到顶部。所以他们彼此都知道。
一个函数定义如下:
function beta(){
console.log("in beta")
}
可以看作是这方面的简写:
var beta = function beta(){
console.log("in beta")
}
区别在于函数的声明和定义都悬挂在范围的开头。
结果代码将以这种方式显示:
(function (exports, require, module, __filename, __dirname) {
var alpha, beta;
alpha = function alpha(){
console.log("in alpha");
beta();
console.log("back in alpha");
}
beta = function beta(){
console.log("in beta")
}
module.exports = {
alpha:alpha
}
});
答案 2 :(得分:0)
未在模块中导出的函数作为无法从外部调用的私有方法。它们只能在导出的某些其他函数使用它时使用,否则将是无法访问的代码。