使用 let 变量而不是使用全局变量

Using let variable instead of using Global variables

我听说在 JavaScript 中使用全局变量不好。由于 let 是块作用域的,我可以在包含所有其他函数的块中使用它并以与全局变量类似的方式使用它吗?

{
  var b = 10;
  let c = 20;
  function foo(){
    return c;
  } 
}

是的,您可以,但需要注意(见下文)。在您的示例中,b 是全局的,但 c 不是。

请注意,该代码中的 foo 是松散模式下的全局变量,因此如果您要这样做,请在代码顶部使用 "use strict";

另请注意,并非所有浏览器都正确支持 let、块中的函数声明等的 ES2015 语义

要支持尚不兼容的旧浏览器,您可以使用旧方法:作用域函数:

(function() {
  var b = 10;
  var c = 20;
  function foo(){
    return c;
  } 
})();

那里,bc 都是局部的,不是全局的,即使我用 var 来代替它们。

当然,支持旧版浏览器的另一种选择是使用转译器,例如 Babel,并让它生成兼容 ES5 的代码(并包含必要的 polyfill)。对于像 IE8 这样真正过时的浏览器(遗憾的是它在某种程度上仍然存在),您可能需要它来输出 ES3 代码(并且您将需要更多的 polyfills)。

(即使有作用域功能,严格模式对于其他事情仍然很方便,例如取消 The Horror of Implicit Globals [披露:这是我贫血的小博客上的 post ].)

在这两种情况下,一个作用域块或一个作用域函数,你最终得到的变量对于你的代码(在作用域block/function内)是有效的全局变量,但不是真正的全局变量,因此没有真正的全局变量所具有的一些问题,例如以意想不到的方式与内置冲突(例如 name 在浏览器的全局范围内,它始终是一个字符串甚至如果您为它分配一个数字或函数——因为它是 window.name,window) 的名称)。