На самом деле, даже в javascript не полностью отключен; javascript допускает лексические замыкания - поэтому без var
старое значение foo
все еще должно быть доступно.
Разница в том, что javascript выбирает , чтобы позволить вам повторно объявить имя с другим значением (во внутренней области). C # выбирает , а не.
Я нахожу версию C # менее запутанной! В частности, когда код (далее в методе) ожидает, что он говорит о «старой» переменной, и вдруг он начинает смотреть на «новую».