2013-12-08 3 views
3

Я изучаю node.js и JavaScript. Ниже приведен код. Я обнаружил, что var http находится вне функции start2. Мне интересно, почему это работает? Поскольку мы экспортируем только функцию start2, правильно?Время переменной переменной JavaScript

Это понятие о закрытии? (Я пытался поставить вар 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

Да, вы объяснили это :), но не имеет ничего общего с названием жизни. – Sarath

+0

Это классический пример закрытия. Закрытие - это особый вид объекта, который объединяет две вещи: функцию и среду, в которой эта была создана функция. Среда состоит из любых локальных переменных, которые были в пределах области действия в момент создания закрытия. –

ответ

2

Вы можете поместить var http = require('http'); внутри функции, но чаще всего это не так, как люди код его. Люди помещают его наверху, как и у вас. Зачем? Это вызов модульной системы для загрузки модуля http. Чаще всего вы хотите сделать это один раз и сделать его доступным для всего файла. Если вы используете этот модуль несколько раз в своем файле, вы не хотите снова и снова звонить require.

Если модуль он редко используется и, возможно, дорого для загрузки, то это может иметь смысл, чтобы иметь require вызов внутри функции, вместо того, чтобы платить стоимость загружая его каждый раз:

function calledUnderExceptionalCircumstances() { 
    var expensive = require('expensive'); 
    expensive.foo(); 
} 
0

В коде, который вы подключили, требуется загрузить модуль в глобальную область. Поскольку вы определили функцию start2 в той же области, из-за закрытия, var http доступен внутри функции start2.

Во втором фрагменте кода, который вы предоставили, из-за закрытия ссылка на переменную env_var1 становится доступной внутри f1, которая получает повторное назначение.

Если вообще не переписывать env_var1, если вы переопределяете env_var1 как var env_var1, var env_var1 становится локальной переменной, а область видимости ограничена внутри f1 и внутри f2, она будет печатать "aaa" вместо " bbb ", как вы и ожидали.

Надеюсь, это поможет.

Смежные вопросы