Как объект можно изменить после передачи другой функции? Например :

var app = require('express')();
var http = require('http').Server(app);

app.get('/', function (request, response) {
    response.sendFile(__dirname + '/index.html');
});

Http уже создан с использованием ранее определенного приложения.

Затем маршрут устанавливается с помощью app.get. Но как это возможно? Как http-сервер будет иметь доступ к этому маршруту, определенному после назначения?

1
trogne 2 Ноя 2018 в 19:10

1 ответ

Лучший ответ

Когда вы передаете переменную объекта в качестве аргумента функции в Javascript, она передается по ссылке. Поэтому, когда вы вносите изменения в app вне http, изменения видны в http, потому что вы внесли изменения в тот же старый объект, ссылка на который была передана в http.

Рассмотрим этот пример:

function print(obj) { // -- this is Http in your case
    setTimeout (()=> { console.log(obj.a); } , 1000);
}

var my_obj = { a: 100 }; // -- this is app in your case

print(my_obj); // -- this is passing app to http in your case

my_obj.a = 101; // -- this is adding a route to app in your case

Будет 101 войти в консоль. Потому что реальный объект изменяется до того, как пройдет 1000 миллисекунд. И глобальный контекст, и функция по-прежнему ссылаются на один и тот же объект. Это доказывает, что объекты передаются по ссылке в Javascript.

Если вы удалите setTimeout, то 100 войдет в консоль, вот фрагмент:

function print(obj) { 
    console.log(obj.a);
}

var my_obj = { a: 100 }; 

print(my_obj);

my_obj.a = 101; 
1
komron 2 Ноя 2018 в 17:00