从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

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

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

 
 

转载于:https://www.cnblogs.com/wangpengli/p/jsbibao.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值