Kevin Smith (2012-12-28T16:25:49.000Z)
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.

{ Kevin }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20121228/537b68a2/attachment.html>
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.