>>920
FAQ にもあるんだが、ローカル変数は、構文解析で代入が見つかるかどうかだけが鍵
実際に(いつ)実行されるかどうかは関係がない

if false
foo = "OK"
end
foo

上記は NameError を起こさないが、以下は foo が NameError を起こす

for e in [1, 2 ,3]
if e == 2 then
foo
else
foo = "OK"
end
end

動作は同一なはずの unless で 代入記述の順番を変えると NameError は起こらない
for 構造はスコープを作らないことに注意

for e in [1, 2 ,3]
unless e == 2 then
foo = "OK"
else
foo
end
end