我们知道在nodejs中,一个模块里声明的变量、方法,只能在这个模块中用,若想让其他模块用,那么这个方法或变量必须exports出去,要引用该模块的模块要require,但是在nodejs中还存在一个作用域,它不需要加载任何模块,直接就可以用。我们现在就研究一下全局作用域里的方法和变量。
glogbal
他代表了nodejs命名空间,任何全局属性、方法都是这个global的属性。
进入repl环境
console.log(global);把全局作用域的所有属性、方法都列出来了。
我们在repl定义一个变量
var songml=“songml”;
console.log(global);
这时候我们看到刚刚加入的songml属性也在这个全局作用域中。
setTimeout
setTimeout(event,time,[args],[...])
event是要触发的事件(回调函数),time是毫秒数,args表示要传到回调函数的参数。
作用:多长时间后触发这个事件。
例子:
var test=function(name){console.log("hello "+name)};
var timer=setTimeout(test,1000,“songml”);
clearTimeout
取消对setTimeout的回调函数的调用
var test=function(name){console.log("hello "+name)};
var timer=setTimeout(test,5000,“songml”);
clearTimeout(timer);
setInterval
setInterval(event,time,[args],[...])
event是要触发的事件(回调函数),time是毫秒数,args表示要传到回调函数的参数。
作用:每隔多长时间后触发这个事件。
例子
clearInterval
clearInterval(event,time,[args],[...])
作用:取消setInterval回调函数的执行
setTimeout、setInterval都返回了定时器对象,下面我们讲解一下定时器对象的unref()、ref()方法
unref与clear...作用一样,取消回调函数的执行,ref()回复回调函数的执行
我们在repl中,对timer.unref()进行测试,没有效果,具体原因不明,
我们把上面的代码写到reftest.js中测试一下
代码:
var test=function(name){console.log("hello "+name)};
var timer=setInterval(test,10000,'songml');
timer.unref();
我们在上面的代码加上timer.ref();
与模块相关的全局函数对象
require
我们都知道他是引用被的模块的,现在我们就写一个引用自己的模块
首先弄一个自己的模块exportstest.js
var testname="songml";
var testfun=function(){console.log("hi")};
exports.testname=testname;
exprots.testfun=testfun;
requiretest.js
var test=require("./exprotstest.js");
console.log(test.testname);
console.log(test.testfun);
require.main
表示是否为主模块
if(module==require.main){
console.log("this is mian module");
}
我们把这个代码加到requiretest.js上
把这段代码加到exportstest.js上
可见require.main是看 那个模块是主模块的,requiretest.js为主模块,那么if语句为true。
require引用模块就把这个模块放到内存中了,第二次引用时候不会再执行引用模块的代码了。
如exportstest.js
var testname="songml";
console.log(testname);
var testfun=function(){console.log("hi")};
exports.testname=testname;
exprots.testfun=testfun;
requiretest.js
var test=require("./exprotstest.js");var test1=require("./exprotstest.js");
执行结果
若想要每次引用模块时候,必须执行模块中的代码,我们可以把代码放到被引用模块的函数里,
exportstest.js
var testname="songml";
var testfun=function(){console.log("hi")};
exports.testname=testname;
exports.testfun=testfun;
var test=require("./exprotstest.js");
var test1=require("./exprotstest.js");
test.testfun();
test1.testfun();
require.resolve返回模块的全路径
require.cache返回被加载的模块
requrie.cache 若没有返回为{}
删除cache
delete require.cache[require.resolve('./app.js')];
_filename _dirname
前者完整的文件名,后者是路径名
filedir.js
console.log(_filename);
console.log(_dirname);
把代码_filename改成__filename
我们写一个filedirtest.js
var test=require('./filedir.js');
filedir.js(主意是2个下划线)
console.log(__dirname);
console.log(__filename);