脚本范围的目的是啥?

Posted

技术标签:

【中文标题】脚本范围的目的是啥?【英文标题】:What is the purpose of the script scope?脚本范围的目的是什么? 【发布时间】:2017-04-02 18:55:21 【问题描述】:

在 DevTools 控制台中检查函数的范围时,我注意到一个“脚本”范围。经过一番研究,它似乎是为letconst 变量创建的。

没有constlet 变量的脚本中函数的范围:

带有let 变量的脚本中函数的作用域:

然而,控制台中会打印出1 - 脚本范围内的变量仍然可以从其他脚本访问:

<script>let v = 1</script>
<script>console.log(v)</script>

我听说过 ES6 模块,其中***变量无法从模块外部访问。这是作用域的用途还是有其他用途?

【问题讨论】:

【参考方案1】:

当您在顶层使用var 声明变量时(即不在函数内部),它会自动成为全局变量(因此在浏览器中您可以将其作为window 的属性访问)。这与使用letconst 声明的变量不同——它们不会成为全局变量。您可以在另一个脚本标签中访问它们,但不能将它们作为window 的属性访问。

看这个例子:

<script>
  var test1 = 42;
  let test2 = 43;
</script>
<script>
  console.log(test1); // 42
  console.log(window.test1); // 42
  console.log(test2); // 43
  console.log(window.test2); // undefined
</script>

【讨论】:

在什么情况下 let 变量 test2 not 可以访问? &lt;script src="..."&gt; 标签?如果它在页面上的所有脚本中都可用,它怎么不是全局的? @samson 这取决于您如何定义“全局”。在 javascript 中,“全局”通常意味着“可以从任何地方访问全局对象的属性(浏览器中的window,Node.js 中的global)”。如果您将其定义为“可从任何地方访问”,那么可以——在顶层使用 let 定义的变量是全局变量。

以上是关于脚本范围的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Powershell 脚本中复制命令的目的是啥?

在 jersey 项目中包含 jersey-bom 导入范围依赖项的目的是啥?

在mysql中使用持久连接的目的和好处是啥?

varchar(0) 的目的是啥

AMD:javascript上下文的目的是啥?

指令系统中采用不同寻址方式的主要目的是啥?