A Just-in-Time Compiler is a compiler that compiles portions of a program at run-time, i.e. while the program is running. For the program to be running, a JIT compiler will need to work in parallel with an interpreter.
This allows for the dynamism of an interpreter while still retaining the possibility of compiler optimizations. Furthermore, due to its nature, a JIT compiler has access to dynamic information which it can use for further optimizations that a traditional Ahead-of-Time (AOT) compiler would not be able to perform.