Declare variables with `let` for module code, but `var` in the Node REPL
- Dominant language
- JavaScript
- Stars
- 740
- Forks
- 29
- PR merge metrics
- No merged PRs in 30d
Description
Using `let` to declare imported variables in compiled code allows the variables to be scoped to the enclosing block, and enables warnings about redeclarations of identically-named variables:
``` js
if (process.env.NODE_ENV === "production") {
import { S3 } from "aws-sdk";
let s3 = new S3();
s3.abortMultipartUpload(params, function (err, data) { ... });
}
// S3 and s3 should not be visible here!
```
Currently the `import` statement is compiled to
``` js
var S3;module.import("aws-sdk",{S3:function(v){S3=v}});
```
The use of `var` means the `S3` variable will be visible anywhere in the enclosing _function_ scope, which is dangerous if `process.env.NODE_ENV !== "production"`.
Ideally (when possible) we would like to use `let` instead:
``` js
let S3;module.import("aws-sdk",{S3:function(v){S3=v}});
```
Note that `const` is not an option because `import`ed symbols must be able to change their values whenever the source module gets around to `export`ing them.
However, using `let` in the Node REPL means you can't `import` the same symbol more than once, which can be really annoying. For that reason, when you `require("reify/repl")`, the compiler should generate `var` declarations instead (as it currently does).
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.