我正在学习node.js和JavaScript。以下是代码。我发现var http
在函数start2
之外。我想知道它为什么有效?既然我们只导出函数start2
,对吧?
这是关于关闭的一些概念吗? (我已经尝试将var http
放在start2
内。这肯定有用。)
var http = require('http');
function start2(){
function onRequest(request,response){
console.log("Request recieved");
response.writeHead(200,{"Content-Type":"text/html"});
response.write("<h1>Hello world</h1>");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start=start2;
答案 0 :(得分:2)
你可以将var http = require('http');
放在你的功能中,但大多数情况下并不是人们编码的方式。人们把它放在顶部,就像你拥有它一样。为什么?这是对模块系统的调用以加载模块http
。大多数情况下,您希望一次并将其用于整个文件。如果您要在文件中多次使用此模块,则不希望一次又一次地调用require
。
如果一个模块很少使用并且加载起来可能很昂贵,那么在函数内调用require
可能是有意义的,而不是每次都支付加载它的成本:
function calledUnderExceptionalCircumstances() {
var expensive = require('expensive');
expensive.foo();
}
答案 1 :(得分:0)
在您附加的代码中,需要将模块加载到全局范围中。由于你在同一范围内定义了函数start2,由于闭包,var http在函数start2中可用。
在你提供的第二个代码片段中,由于关闭,对变量env_var1的引用在f1中可用,这将被重新分配。
如果你要将env_var1重新定义为var env_var1,而不是直接重新分配env_var1,var env_var1变成一个局部变量,它的范围被限制在f1和f2内,它将打印“aaa”而不是“bbb” “正如你所期望的那样。
希望这有帮助。