Kevin Smith (2012-12-28T16:25:49.000Z)
github at esdiscuss.org (2013-07-12T02:26:06.488Z)
> ```js > module "foo" { > export let state = 5; > export function modifyState() { > state = 10; > }; > } > > import { state, modifyState } from "foo"; > > assert(state === 5); > modifyState(); > assert(state === 10); > ``` That's it. > This is, to me as an ES5 programmer, very weird. There is *no other > situation in the language* where what an identifier refers to can change > without me assigning to it. Chicken and egg. It's doesn't exit because ES doesn't have modules. Node "modules" are just functions, remember. > This is compounded by the syntax used by `import`. The > pseudo-destructuring microsyntax, plus the superficially declaration-like > nature of that line, make you expect it to behave like a normal `let` or > `var` declaration with destructuring assignment, which we are used to from > CoffeeScript, Python, JS 1.8, etc. Obviously, it's a very different animal. Yes - and I agree that false symmetry should be avoided. On the other hand, it would be awkward to have the import renaming syntax completely out-of-line with destructuring syntax. > Finally, I can't shake the feeling I'm missing something. Why is this > aliasing property valuable, given that it's so contradictory to > expectations? I am totally on board with the need for static analysis and > thus top-level-only import and export statements. The "just copy Node" > peanut gallery is wrong, and the static analysis is not only necessary for > asynchronous browser loading, but also adds a lot of power to the language. > But what does the aliasing add? Is it connected to static analysis in some > way I don't understand? Well, it also allows proper circular dependencies, for one.