то есть, хотя большинство этих типов/тегов и нельзя отличить от объекта из-за неявного оборачивания интерпретатором, существует как минимум один жесткий раздел, а именно — оператор вызова функции, который применяется исключительно к функциям и только к ним. Механизма переопределения операторов нет, создать объект, который будет вести себя, как функция, невозможно. Следовательно, если мы встречаем в коде на JS строку типа
a();
это фактически утверждение, что в любой момент достижения потоком исполнения этого места в коде в a будет функция, независимо ни от чего. Поскольку JS принципиально однопоточный, вполне возможен автоматический анализ кода, чтобы доказать, что в a никогда не будет ничего, кроме функции.