Nodejs 模块作用域

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs 模块作用域相关的知识,希望对你有一定的参考价值。

Node中,存在着模块作用域的概念,即默认情况下,模块彼此间无法访问对方的成员,只能通过require方法来进行模块间通信。当然,模块作用域的存在也带来了好处,使得我们可以避免变量命名冲突的情况。

模块作用域的特点:

  • 模块是完全封闭的
  • 外部访问不到内部
  • 内部也访问不到外部

require方法的特点:

  • require方法会默认执行被加载模块中的代码
  • require方法可以得到被加载模块的接口对象exports(该对象默认为一个空对象),被加载模块需要手动地将供外部访问的成员挂载到exports对象上。

注意:require方法只是加载并执行其他模块,并不会污染其他模块。

默认情况下,模块彼此间无法访问对方的成员,例:

模块1代码:

console.log(a);

console.log(add(10, 20));

模块2代码:

let a = 1;

function add(num1, num2) 
    return num1 + num2;

运行模块1,结果如下:

可见,默认情况下,模块彼此间无法访问对方的变量方法

这时,我们可以使用require方法来解决这一问题,require方法默认会执行被加载模块中的代码,并得到被加载模块的exports接口对象(该对象默认为一个空对象)。

语法格式:

require('文件的路径')

使用require方法进行模块间通信,例:

模块1代码:

console.log('module1 start');

const obj = require('./module2.js');

console.log(obj);

console.log('module1 end');

模块2代码:

console.log('module2 start');

exports.a = 2;

exports.add = function add(num1, num2) 
    return num1 + num2;
;

console.log('module2 end');

执行模块1的代码,结果如下:

模块2需要把供外部访问使用的成员手动的挂载到了exports接口对象上,模块1使用require方法加载模块2时,就会得到模块2的exports接口对象。同时,会默认执行模块2中的代码。

此时,在模块1中可以使用模块2中的成员:

console.log(obj.a);
console.log(obj.add(10, 20));

输出结果:

总结:

  • Node 中存在模块作用域,模块彼此间无法访问对方的成员。
  • 使用require方法可以实现模块间通信。
  • require方法会默认执行被加载模块中的代码。
  • exports接口对象默认为一个空对象。
  • 被加载模块需要手动地将供其他模块访问的成员挂载到exports 接口对象上。

以上是关于Nodejs 模块作用域的主要内容,如果未能解决你的问题,请参考以下文章

模块化 —— CommonJSAMDUMDESM(上)

Commjs规范

nodejs学习笔记

初学NodeJs

前端nodejs模块化

第一天nodejs的笔记