原です。

どうもループの中の局所変数の扱いが分からなくなってし
まいました。

------------^ test1.rb
for i in 0..1
  print defined?(j), "\n"
  j = 0
end
------------$ test1.rb

を動かすと

FALSE
local-variable

となるべきかと思うのですが、実際は

FALSE
FALSE

と出力されます。これはなぜでしょう?さらに

------------^ test2.rb
#j = 0
for i in 0..2
  print "1)", defined?(j), "\n"
  j = -100 if FALSE
  print "2)", defined?(j), "\n"
  print "3)", j, "\n"
  j = j+1
end
------------$ test2.rb

の結果は

1)FALSE
2)local-variable
3)nil
1)FALSE
2)local-variable
3)1
1)FALSE
2)local-variable
3)2

となります。「j = -100 if FALSE」で j が定義されるのは
なぜでしょうか?さらに一辺、未定義になっても前回の値を
記憶しているのも不思議です。最初の行の j = 0 のコメント
を外せば期待通りの出力ですが。