【问题标题】:what is difference between scope and namespace in javascriptjavascript中范围和命名空间有什么区别
【发布时间】:2021-10-24 09:04:20
【问题描述】:

大家好。实际上我是新学 Javascript 的。我在 javascript 中阅读了有关范围的信息。然后我在某个地方读到了 Js 中的命名空间,我想知道命名空间是否与作用域完全相同,所以我搜索了但结果只是针对 python 进行了解释,我不知道它们在 js 中是否相同。

有人能解释一下js中作用域和命名空间的区别吗?

我对作用域的定义:作用域是编程语言中的一个概念,可以帮助我们防止变量污染。这意味着我们控制代码中变量和函数的可访问性。 js 是一种函数作用域语言,这意味着如果我们创建新函数,就会创建新作用域。我们可以在新关键字 letconst

的帮助下声明块作用域而不是函数作用域变量和函数

【问题讨论】:

  • 在 JavaScript 中没有正式称为“命名空间”的东西。 一个官方的概念叫做“范围”。所以,我想区别在于一个存在,另一个不存在。
  • @T.J.Crowder 好的,我的立场是正确的。但我觉得 OP 并不是专门谈论模块命名空间外来对象。
  • "...我在某处读到了 Js 中的命名空间" - 你在哪里读到的?可以分享一下链接吗?
  • 一个简短的description

标签: javascript scope namespaces global local


【解决方案1】:

“命名空间” 仅在与 module namespace exotic object 相关的 JavaScript 规范中使用,module namespace exotic object 是在您从模块执行 import * 时创建(或重用)的对象。它包含模块的所有命名导出的属性(如果有默认导出,还有一个名为 default 的属性)。

在 JavaScript 有官方模块之前,“命名空间”根本没有用于 JavaScript 的定义。 非正式地使用它来指代由一个代码单元(松散地称为“模块”)创建的对象,该对象具有该模块的“导出”属性,如下所示:

// ES5 code - one style of the "revealing module pattern"
var MyLib = (function() {
    function internalFunction() {
        // ...
    }

    return {
        exportedFunction: function() {
            // ...
        }
    };
})();

在那里,MyLib 有时被称为“命名空间”,但这纯粹是非正式的。它只是一个对象。

“作用域”是程序源代码的一个区域,它为变量和相关事物定义了一个容器。 (有时它用于指代规范定义的结果“对象”,但更恰当地称为词法environment records。)例如,此源代码有两个显式范围:

function example(someParam) {
    if (someParam === "some value") {
        console.log("something");
    }
}

范围是:

  • 定义函数体的{} 内的函数范围。
  • {} 内的块范围定义了 if 上的块。

(函数周围还有隐式作用域,这取决于此源代码出现的位置——有时称为“环境作用域”。)

在运行时,当调用example 时,规范描述了为函数范围创建环境记录,然后为块范围创建环境记录。 (这只是规范语言;JavaScript 引擎不必按字面意思执行。)有时,一个范围可以有两个为其定义的环境记录(全局范围就是这样),但通常是一对一的。

【讨论】:

  • 非常感谢您的回答 T.J.克劳德。你知道,我是 JS 的初学者,我在你的解释中发现了一些我没有读过的概念。所以我认为最好完成整个课程然后再阅读你的。
  • @mahdizarepoor - 很公平,我希望你的学习顺利!顺便说一句,您对“范围”的定义一点也不差。这不仅仅是只是隔离变量,而是你所拥有的对于理解它来说确实不是一个糟糕的起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2014-08-10
  • 2012-07-10
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多