美文网首页
深入了解模块原理

深入了解模块原理

作者: 想当一个大头兵 | 来源:发表于2017-11-16 14:08 被阅读0次

当我们编写JavaScript代码时,我们可以申明全局变量:

var s ='global';

在浏览器中,大量使用全局变量可不好。如果你在a.js中使用了全局变量s,那么,在b.js中也使用全局变量s,将造成冲突,b.js中对s赋值会改变a.js的运行逻辑。

也就是说,JavaScript语言本身并没有一种模块机制来保证不同模块可以使用相同的变量名。

那Node.js是如何实现这一点的?

其实要实现“模块”这个功能,并不需要语法层面的支持。Node.js也并不会增加任何JavaScript语法。实现“模块”功能的奥妙就在于JavaScript是一种函数式编程语言,它支持闭包。如果我们把一段JavaScript代码用一个函数包装起来,这段代码的所有“全局”变量就变成了函数内部的局部变量。

请注意我们编写的hello.js代码是这样的:

var s ='Hello';

var name ='world';

console.log(s +' '+ name +'!');

Node.js加载了hello.js后,它可以把代码包装一下,变成这样执行:

(function(){

// 读取的hello.js代码:

        var s ='Hello';

       var name ='world'; 

        console.log(s +' '+ name +'!');

// hello.js代码结束

})();

这样一来,原来的全局变量s现在变成了匿名函数内部的局部变量。如果Node.js继续加载其他模块,这些模块中定义的“全局”变量s也互不干扰。

所以,Node利用JavaScript的函数式编程的特性,轻而易举地实现了模块的隔离。

但是,模块的输出module.exports怎么实现?

这个也很容易实现,Node可以先准备一个对象module:

// 准备module对象:

var module = {

        id: 'hello',

        exports: {}

};

var load = function (module) { 

         // 读取的hello.js代码:

        function greet(name) {

                console.log('Hello, ' + name + '!');

        }

        module.exports = greet;

        // hello.js代码结束

        return module.exports;

};

var exported = load(module);

// 保存module:

save(module, exported);

可见,变量module是Node在加载js文件前准备的一个变量,并将其传入加载函数,我们在hello.js中可以直接使用变量module原因就在于它实际上是函数的一个参数:

module.exports = greet;

通过把参数module传递给load()函数,hello.js就顺利地把一个变量传递给了Node执行环境,Node会把module变量保存到某个地方。

由于Node保存了所有导入的module,当我们用require()获取module时,Node找到对应的module,把这个module的exports变量返回,这样,另一个模块就顺利拿到了模块的输出:

var greet =require('./hello');

以上是Node实现JavaScript模块的一个简单的原理介绍。

相关文章

  • 深入了解模块原理

    当我们编写JavaScript代码时,我们可以申明全局变量: var s ='global'; 在浏览器中,大量使...

  • 模块导论:为什么你要深入了解个体?

    模块一 激发个体 第2讲 | 模块导论:为什么你要深入了解个体? ➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖ ️模块导论:为什...

  • iOS深入学习知识点100+

    ARC原理与深入了解ARC就是代码中自动加入了retain/releaseAutoReleasePool 原理AR...

  • 深入ThreadLocal

    主要内容 ThreadLocal 基本操作 实现原理 前言 本文主要深入了解ThreadLocal的内部实现原理,...

  • WebRTC简介

    对WebRTC有一个初步了解,然后根据功能和模块逐步深入

  • GPUImage概览

    读GPUImage源码,深入了解GPUImage原理及OpenGL ES。 关于GPUImage GPUImage...

  • JVM中GC类型及参数设置

    本文内容为JVM垃圾收集器及算法,并不涉及具体方法实现原理,如需深入了解算法原理,请参考《深入理解Java虚拟机》...

  • 模块八_Zookeeper深入了解

    序言: 文章内容输出来源:拉勾教育Java高薪训练营。本篇文章是学习课程中的一部分课后笔记 一、简介 1、zook...

  • 模块九_dubbo深入了解

    序言: 文章内容输出来源:拉勾教育Java高薪训练营。本篇文章是学习课程中的一部分课后笔记 一、简介 1、dubb...

  • Python入门基础

    学习要点: 弱语法,重原理。语法是表现,只有了解深层原理,才能灵活运用。需要深入内存,剖析原理,才能看清语法。 重...

网友评论

      本文标题:深入了解模块原理

      本文链接:https://www.haomeiwen.com/subject/dyulvxtx.html