OP didn't redefine `err`, just assigned a new value to the `err` variable that was available as `catch`'s parameter. Only the catch's error variable is scoped to the catch block. Any variable that's defined inside `catch` block using `var` is hoisted in the scope of the nearest function.
So, the `return e` in your example works since `e` was hoisted when you defined it using `var e = err`. If you tried `return err` instead, it'd result in a `ReferenceError`.