从node.js模块化开发来了解javascript闭包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从node.js模块化开发来了解javascript闭包相关的知识,希望对你有一定的参考价值。

  之前看过很多关于javascript闭包的解释,只有短短几个demo,一大段晦涩难懂的介绍,巴拉巴拉一大段闭包的概念,但是到最后也没看懂闭包到底是什么意思,起什么作用,直到昨晚凌晨,我在学习node.js模块开发的时候,才突然恍然大悟,所以赶紧记下来,免得以后忘记。代码来源:廖雪峰的网站node.js教程。

  直接上代码:

我们首先编写了一个hello.js文件,这个hello.js文件就是一个模块,模块的名字就是文件名(去掉.js后缀),所以hello.js文件就是名为hello的模块。

我们把hello.js改造一下,创建一个函数,这样我们就可以在其他地方调用这个函数:

‘use strict‘;

var s = ‘Hello‘;

function greet(name) {
    console.log(s + ‘, ‘ + name + ‘!‘);
}
//下面这句代码暂时先不用管
module.exports = greet;

在这里我们可以看到直接运行greet();结果会输出

‘Hello,undefind!‘
这是在意料之中的,因为我们定义了一个全局变量s 然后greet()这个函数使用了变量s。
接下来,我们再编写一个main.js文件,调用hello模块的greet函数:
‘use strict‘;

// 引入hello模块,暂时也不用管
//我们可以理解为将hello.js中的greet()方法引用main.js中
var greet = require(‘./hello‘);

var s = ‘Michael‘;

greet(s); // Hello, Michael!

这两段代码可以合并成为下面这样:

var s = ‘Michael‘;
(function greet(name) {
    var s = ‘Hello‘;
    console.log(s + ‘, ‘ + name + ‘!‘);
})(s);

这里我们就可以发现了,有两个变量都是s,但是运行结果依然是:

Hello, Michael!


 这是为什么呢,原来我们在不经意间就形成了闭包,只不过自己不知道而已,现在我们再来分析一下上面这段整合完毕的代码,

var s = ‘Michael‘;//这个是定义的全局变量
var s = ‘Hello‘;//这个是定义在函数greet()的局部变量

闭包就是函数定义了全局变量和局部变量,我们函数内可以调用全局变量,在全局作用域却无法访问函数内的变量,我们接下来再稍微改一下代码
var n = ‘Michael‘;
(function greet(name) {
    var s = ‘Hello‘;
    console.log(s + ‘, ‘ + name + ‘!‘);
})(n);
console.log(s);

这样可以确定已经没有全局变量s了,那我们这样直接访问函数内部的变量s,结果会输出什么呢:

Uncaught ReferenceError: s is not defined

这样我们就可以确信在全局无法访问函数内的变量了,闭包完成。

如有错误请积极指出,十分感谢大家!!

 
 









以上是关于从node.js模块化开发来了解javascript闭包的主要内容,如果未能解决你的问题,请参考以下文章

Node.js开发入门—HelloWorld再分析

React-Native - 使用依赖于 node.js 核心模块的 Javascript 模块

了解nodeES6

node.js 模块的分类

Node.js 究竟是什么?

10+ 最佳的 Node.js 教程和实例