Проблема с вашим кодом заключается в том, что foo устанавливается ПОСЛЕ возвращения JSON-запроса (в функции обратного вызова).Перемещение оповещения в обратный вызов решило бы проблему.
С точки зрения области действия код в порядке.Поскольку javascript имеет замыкания, функция обратного вызова будет иметь доступ к окружающему контексту (включая переменную foo).Поэтому, когда вы устанавливаете foo, вы устанавливаете ту же самую переменную.