首页 > 解决方案 > ES6 模块中是否有任何上下文/情况无法更新 var 来让?

问题描述

一段时间以来,我习惯于const声明大多数变量。

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

我几乎从不使用var.

这就是我。

但是,任何其他编写 javascript 的人都会有自己喜欢的变量声明约定,如果我接受用户生成的内容,例如用户编写的 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

我也知道 ifmyStringmyFunction被声明为let

它们随后不能被varlet或覆盖const

例子:

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();

那么,了解这两件事后,在所有用户提交的 ES6 模块var中将任何声明转换为let声明(在编译时或运行时)是否是一种合理的保障措施?

ES6 模块中是否有任何可能无法更新var到的上下文/情况let

标签: javascriptecmascript-6es6-modulesvariable-declaration

解决方案


如果用户编写了这样的函数,将 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 未定义。


推荐阅读