Understanding Debounce code
loop() does not need any time and repeats permanently.
lastButtonState is reading from previous loop run.
As long as the button bounces, lastDebounceTime is updated.
Only when the button has settled (either pressed or released), the condition
  ((millis() - lastDebounceTime) &gt; debounceDelay)

becomes true and the code is executed -&gt; if buttonState (the previous debounced state) and reading show a change to HIGH, the led state is toggled.
Not sure if this explanation makes anything clearer, as it is clear already as it stands, IMO.