码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-09-27 13:11:24      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:log   ons   整合   教程   运行   reference   dem   去掉   全局   

  之前看过很多关于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闭包

标签:log   ons   整合   教程   运行   reference   dem   去掉   全局   

原文地址:http://www.cnblogs.com/wangpengli/p/jsbibao.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!