Yes, the scan for variable names can be thought of as a preprocessing stage. At the same time, all the DEF names are collected, and their parameters.
There are many steps in the path between compiled and interpreted, it is not just one step with every language clearly on one side or the other. One thing I do know is that code is not executed directly from the 'slots'. If you type in the following code into slot 0, for instance:
VAR Z=0 LOAD "PRG0:some program" PRINT 1/Zyou will get Divide by zero in 0:3, and LIST ERR will bring you to line 3 of the current contents of slot 0 - which likely does not have a divide-by-zero error.