Например, я пишу следующий код:
var http = require('http');
var server = http.createServer(function(req, res) {
res.end('Hello world!');
});
server.listen(8000, function() {
console.info('Serever started');
});
Однако определение server.listen () выглядит так:
server.listen (порт, имя хоста, невыполненная работа, обратный вызов);
Метод listen () имеет четыре параметра, в то время как в моем коде были переданы только два параметра - порт и обратный вызов. Откуда методу известно, что function () {console.info ('Сервер запущен');} является «обратным вызовом», а не «именем хоста»? Автоматически проверяет тип параметров?
Функция listen сама распознает типы параметров и перегрузку, поэтому в вашем примере port - это число, hostname, вероятно, строка, backlog, вероятно, строка, а callback - это функция. Затем в теле функции есть логика, которая решает, какой параметр что представляет. В этом и заключается сила динамически типизированных языков
В примере вы указали второй параметр - это функция, поэтому listen подозревает, что это не hostname или backlog, а callback, и использует его как callback. В языках со статической типизацией, таких как Java, разработчик функций listen был бы вынужден несколько раз перегружать этот метод. Таким образом, в javascript этот метод определяется один раз, в java он определяется как пять или более раз, каждое определение с другим списком параметров



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Node.js - нет, а функция работает.