Yet another, still simpler, variation on this puzzle:
property theState : 0
script Inner
on showTheState()
display dialog "State " & theState
end showTheState
end script
script Outer
Inner
end script
set x to Outer
set theState to 1
tell Inner to showTheState()
set theState to 2
tell Inner to showTheState()
As before, running this program will display "State 0" twice. Either
changing the "property" declaration to a "global" declaration, or
commenting out the "set x to Outer" statement, will cause it to display
"State 1", "State 2".