> The js and coffeescript ways of handling this seem both to come down to the assignment operator being used for both creating bindings and mutating them
That is not quite the case in javascript, `var` creates a binding (also `let` in ES6), and assignment assigns to the binding.
There is the issue that assigning to an non-existant binding creates a global one, but strict mode will turn it into an error and linters have little issue recognizing and warning against it either.