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

标签 javascript ecmascript-6 let

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

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

最佳答案

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

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

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

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

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

那里,bc 都是局部的,而不是全局的,即使我为它们使用了 var

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

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

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

关于javascript - 使用 let 变量而不是使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45648776/

相关文章:

javascript - 发送 prop 然后将其用作 React 中的函数?

javascript - 以原始顺序迭代 jQuery JSON 对象

Javascript Regex 格式 - 适用于 PHP,不适用于 JS

javascript - 删除对象中键的每个实例的优雅方法?

angular - 将 Angular 12 升级到 13 - mjs 文件中的编译错误

swift - 为什么我不能在 swift 中使用一个全局变量作为另一个全局变量定义的一部分?

recursion - 试图理解方案中的 "let"

lambda - 如何使用 lambda 实现 let*

javascript - 将 SPA 从 elm 转换为 android 应用程序

javascript - 如何使用带有变量的javascript访问对象数组