标签: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
这样我们就可以确信在全局无法访问函数内的变量了,闭包完成。
如有错误请积极指出,十分感谢大家!!
标签:log ons 整合 教程 运行 reference dem 去掉 全局
原文地址:http://www.cnblogs.com/wangpengli/p/jsbibao.html