nodejs -全局作用域

我们知道在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;

requiretest.js

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);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值