gpt4 book ai didi

JavaScript:命名空间与作用域

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:39:34 25 4
gpt4 key购买 nike

我对 JavaScript 中作用域和闭包的概念有相当好的理解。

此外,以下站点提供了如何实现 JavaScript 命名空间的示例:

  1. Everything you wanted to know about JavaScript scope
  2. Namespacing in JavaScript

我仍然不明白的是,有多少人似乎混淆了作用域和命名空间的概念。此外,同一个人还经常提到不应该“污染全局命名空间”和不应该“在全局范围内创建全局变量/变量”。

问题

  • 范围和 namespace 是两个完全不同的概念,这不正确吗?
    • 命名空间:对代码进行分组,使得组内的名称是唯一的,并且不会与其他命名空间中的相似名称冲突
    • 范围:定义变量的可访问性。 JavaScript 有两个作用域,全局作用域和局部作用域/函数作用域(ES 2015 引入了带有 let/const 的 block 作用域)
  • 下面的对象字面量为bar创建一个新的命名空间是否正确,避免污染全局命名空间(foo除外),但是那个bar 仍然在全局范围内:var foo = { bar: 42 }
  • “不要创建全局变量,这样就不会污染全局命名空间”这句话没有错吗?全局变量与局部变量(作用域)不同于命名空间。正如所见,完全有可能在新的命名空间中屏蔽一个变量,并且它仍然在全局范围内。
  • 如果避免污染全局命名空间是我们不应该创建全局变量的唯一原因,那么仅创建新的命名空间并仍然保持全局变量是否还不够?

最佳答案

Is it not correct that scope and namespace are two completely different concepts?

我不会说作用域和命名空间完全无关。如果按“namespace”的字面意思,就是一个space。不同名称的名称 - 如您所说,独一无二且不会与其他空间的名称冲突。

在这方面,一个作用域肯定形成了一个 namespace ——变量名称是不同的,不会与其他作用域中的名称冲突。但是,作用域是内部的,无法从外部访问,因此对于组织事物而言并不是特别有趣。

一个对象也形成一个 namespace ——属性名称是不同的,不会与其他对象的名称冲突。这就是为什么使用对象将代码结构化为模块,这就是 JavaScript 中“命名空间”的传统含义。

Is it correct that the following object literal creates a new namespace for bar, avoiding to pollute the global namespace (except for foo), but that bar is still in the global scope: var foo = { bar: 42 }

不,bar 不是全局范围的成员。它是某个对象的属性。

Is it not wrong to say "don't create global variables so you do not pollute the global namespace"? Global vs local variables (scope) is different from namespacing.

全局变量在 JS 中有点特殊:它们既是全局对象的属性,又是全局范围内的变量。这就是为什么我们谈论“全局 namespace ”以包含所有内容 - 并特别强调名称不得冲突。

If avoiding to pollute the global namespace is the only reason for why we should not create global variables, is it not enough to just create new namespaces and still keep it all global?

创建 namespace ,如上面示例中的 {bar: 42},仍然会创建全局变量:foo。它只是创建更少 的变量——每个模块一个。它还创建了一定的命名约定,即全局变量应该引用模块而不是普通变量。我们不会使用 var i, increment, decrement;var counter = {i: …, increment(){…}, decrement(){…}}; ,并在名称 counter 中引用它们的用途。

关于JavaScript:命名空间与作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com