Skip to main content

模块化和闭包

闭包跟模块之间的关系

根据闭包的生成条件与实践场景,模块中非常容易生成闭包。

每一个JS模块都可以认为是一个独立的作用域,当代码执行时,该词法作用域创建执行上下文,如果在模块内部,创建了可供外部引用访问的函数时,就为闭包的产生提供了条件,只要该函数在外部执行访问了模块内部的其他变量,闭包就会产生。

要实现“模块”这个功能,并不需要语法层面的支持。Node.js也并不会增加任何JavaScript语法。实现“模块”功能的奥妙就在于JavaScript是一种函数式编程语言,它支持闭包。

如果我们把一段JavaScript代码用一个函数包装起来,这段代码的所有“全局”变量就变成了函数内部的局部变量。

hello.js

var s = 'Hello';
var name = 'world';

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

Node.js加载了hello.js后,它可以把代码包装一下。 这样一来,原来的全局变量s现在变成了匿名函数内部的局部变量。 如果Node.js继续加载其他模块,这些模块中定义的“全局”变量s也互不干扰。 所以,Node利用JavaScript的函数式编程的特性,轻而易举地实现了模块的隔离

(function () {
// 读取的hello.js代码:
var s = 'Hello';
var name = 'world';

console.log(s + ' ' + name + '!');
// hello.js代码结束
})();