Nodejs导出调用非导出函数的函数

时间:2016-02-03 08:56:30

标签: javascript node.js

这是一种好奇心的问题。

假设文件库.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()?如果有人能够在技术细节上解释这个过程,那就太好了。

3 个答案:

答案 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)

未在模块中导出的函数作为无法从外部调用的私有方法。它们只能在导出的某些其他函数使用它时使用,否则将是无法访问的代码。