ES6 模块中是否存在无法将 var 更新为 let 的上下文/情况?

Are there any contexts / situations in ES6 Modules where it wouldn't work to update var to let?

一段时间以来,我使用 const 来声明大多数变量。

如果我不能完全确定新变量将始终保持相同的值,我将使用 let.

声明新变量

我几乎从不使用var

就是我。

但是,任何其他编写 javascript 的人都会有自己的首选变量声明约定,如果我接受 user-generated-content 例如 用户编写的 ES6 模块 无法自信地预测这些约定可能是什么。


暂且不说 const...

var可以被var覆盖:

我知道以下内容:

可以用 var.

声明的同名变量覆盖

示例:

var myString = 'My String declared with var';
var myFunction = function() {console.log('My Function declared with var')};

var myString = 'My Overwriting String declared with var';
var myFunction = function() {console.log('My Overwriting Function declared with var')};

console.log(myString);
myFunction();

let 不能var覆盖:

我也知道如果 myStringmyFunction 是用 let

声明的

它们随后不能被 varletconst 覆盖。

示例:

let myString = 'My String declared with let';
let myFunction = function() {console.log('My Function declared with let')};

var myString = 'My Overwriting String declared with var';
var myFunction = function() {console.log('My Overwriting Function declared with var')};

console.log(myString);
myFunction();

所以,知道了这两件事,在所有 User 中将任何 var 声明转换为 let 声明(无论是在编译时还是在运行时)是否是一种合理的保护措施提交的 ES6 模块?

在 ES6 模块中是否存在无法将 var 更新为 let 的任何可想象的上下文/情况?

如果用户编写了这样的函数,将 var 更改为 let 将会失败:

function run() {
  for (var i = 0; i < 3; i++) {
    console.log(i);
  }
  console.log('final i', i);
}

console.log('starting run');
run();

function runLet() {
  for (let i = 0; i < 3; i++) {
    console.log(i);
  }
  console.log('final i', i);
}

console.log('starting runLet');
runLet();

runLet 函数错误,因为 i 未定义。