JavaScript变量的生命周期

时间:2013-12-08 12:46:19

标签: javascript node.js

我正在学习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;

2 个答案:

答案 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” “正如你所期望的那样。

希望这有帮助。