在前端的JavaScript中,我们都不会把变量暴露在全局,比如jQuery,在全局只注册了一个$对象. 众所周知我们都会用匿名函数把私有变量限制在一个私有作用域,必要时才会在全局注册一个对象,比如jQuery的思路
(function(w,u){
//var something and function something
w.$=someObject;
})(window,undefined);
但在Node.js中,对于我这样的初学者,关于作用域的说明实在有点少,比如模块化的概念,令初学者对整个app的作用域逻辑感觉混乱,且别说Callback和和异步编程思路.还有就是运行了Node后没有类似Chrome的Console,这个是最晕的,比如检查一下究竟变量有没暴露在全局.好在有repl,这些问题都得以解决.
首先,我会想象Node.js运行一个app.js,都会用匿名函数把整个App.js的代码私有化,除非在代码中显式地申明(或是没有var)这个是全局对象(废话),当然我们不用自己写这个匿名函数,或者说运行Node app.js时,可以理解成app.js()
其次,module间的变量/对象是不可见的,只能够通过exports传递,就是说,我们不能把模块理解成app.js这个匿名函数里创建的一个对象(函数也是对象).
/**
* Created with JetBrains WebStorm.
* User: BiG
* Date: 5/13/13
* Time: 6:06 PM
* To change this template use File | Settings | File Templates.
*/
//this is app.js
global.globalApp = 'this is global var';
var appjsVar = "this is from app";
exports.outAppjs = appjsVar; //如果把这句写在require后,module将得不到outAppjs
var modulejs = require('./module'),
modulejsDo = modulejs.doSome(2),
repl = require('repl');
console.log(appjsVar);
console.log(globalApp);
console.log(modulejs.fromModule);
console.log(modulejsDo);
console.log(modulejs.backToAppjs);
repl.start('>');
//this is module.js
var inModule = "this is from module",
fromAppjs = require('./app');
exports.fromModule = inModule;
exports.doSome = function (e) {
var a, b, c;
a = b = e;
c = 'this is from module.dosome,and the result is ' + (a + b);
return c;
};
exports.backToAppjs = fromAppjs.outAppjs + ' WARN:is is from appjs to module,and back to appjs';
其实无论app.js,还是module.js,其作用域全部是私有的…我在app.js的局部变量想让module.js知道,我只能通过exports传过去,而且必须把export写在require前,否则require了,变量其实还没过去…
以下是结果
this is from app
this is global var
this is from module
this is from module.dosome,and the result is 4
this is from app WARN:is is from appjs to module,and back to appjs
>
感谢repl哈哈,这种方式和Chrome很相似