AlexNew22, ну конкретно у вас вообще-то в том, что вы возвращаете функцию foo, но у неё не перееопределены методы toString/valueOf, потому что они переопределяются только после запуска функции, а вы её не запустили.
А после запуска она возвращает уже новую функцию foo и далее смотри выше…