javascript 模块化

来源:互联网 发布:优圣美算法题 编辑:程序博客网 时间:2024/05/17 09:25

javascript 模块化

在 Node.js 的官方示例代码中,第一行代码引入了 Node.js 的 http 模块:

const http = require(‘http’);

这里想要掌握 http 模块,首先需要先掌握什么是模块,也就是模块的概念,以及分别在 JavaScript 和 Node.js 中的具体使用情况。

在 ECMAScript 2015 发布之前,JavaScript 语言是不存在所谓模块的概念的。JavaScript 只提供了全局域与函数域、函数、对象等内容,那要如何可以解决这个问题呢?


函数的封装

所谓函数,简单来说就是把一系列具有特定作用的语句打包在一起。而且,这些语句的作用域仅在当前函数内。所以,我们可以将函数的封装,作为模块化的第一步。

function callme (){
return ‘this is function.’;
}

上述示例代码,定义了一个 callme 函数,这样就可以在之后的代码中进行调用。而callme 函数可以用来完成一个特定的功能。但,这样做也是有明确的缺点: 污染全局命名空间,并且模块成员之间没有任何关系。callme 函数是一个全局函数。也就是说,你不能在全局作用域中再定义一个 callme函数,不然会引起命名冲突。如果,上述写法不是很理解的话,那可以看一下如下写法:

var callme = function(){
return ‘this is function.’;
}


对象的定义

为了解决封装函数所带来的问题,可以引入 JavaScript 对象的概念。就是把所有相关的模块成员封装在一个对象中,如下所示:

var myModule = {
callme : function(){
return ‘this is function.’;
}
}

这样的好处就是:

解决了全局命名空间可能出现的冲突问题。因为所有的模块成员都是作为一个对象的属性或方法存在的。模块成员之间也存在着某种关系。因为被定义在同一个 JavaScript 对象中,作为属性或方法存在。

而这个对象名成为了所有模块成员对外的一个统一的模块名称。


自调函数

看似引入对象概念后,这个模块的解决方案不错。但,依旧存在着一些问题。比如,我们定义了如下一个模块(对象):

var myModule = {
name : ‘longestory’,
callme : function(){
return ‘this is ‘+this.name;
}
}

对于这样一个模块(对象),我们是可以从外部对该模块(对象)的属性或方法进行修改的。

myModule.name = ‘javascript’;

这就导致了会产生一些意外的安全问题,而我们可以通过自调函数来进行解决。

var myModule = (function(){
var name = ‘longestory’;
function callme(){
return ‘this is ‘+name;
}
})();

根据上述示例代码,在模块(对象)外部就无法修改内部的属性或方法。而综上所述,就是 JavaScript 的模块化基础。


转载自’龙哥有话说’

0 0
原创粉丝点击