The code will output: 0 1 2 (after 1 second). This demonstrates the behavior of closures with the let keyword, which has block scope. Each iteration of the loop creates a new block-scoped i variable, which is captured by the setTimeout callback. After 1 second, the callbacks execute, each with its own captured value of i (0, 1, and 2). If var were used instead of let, the output would be 3 3 3, because var has function scope, not block scope, so all callbacks would share the same i variable, which would be 3 after the loop completes.