javascript中作用域和命名空间的区别



大家好。实际上我最近在学习Javascript。我读过javascript中的作用域。然后我在某个地方读到关于Js的命名空间,我想知道命名空间是否与作用域完全相同,所以我搜索了,但结果只是解释了python,我不知道它们在Js中是否相同。

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

我对作用域的定义作用域是程序设计语言中的一个概念,它可以帮助我们防止变量污染。这意味着我们可以控制代码中变量和函数的可访问性。Js是一种函数作用域语言,这意味着如果我们创建新的函数,就会创建新的作用域。在新的关键字let的帮助下,我们可以声明块作用域而不是函数作用域变量和函数,const

"Namespace"仅在JavaScript规范中用于与模块名称空间外部对象相关的对象,该对象是在从模块执行import *时创建(或重用)的对象。它包含模块所有命名导出的属性(如果它有默认导出,则包含一个称为default的属性)。

在JavaScript有官方模块之前,"命名空间"在JavaScript的定义中根本没有使用。它被非正式地使用指的是由一个代码单元(松散地说,是一个"模块")创建的对象,该对象具有"导出"属性。该模块的,像这样:

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

在那里,MyLib有时被称为"命名空间"。但那完全是非正式的。它只是一个对象。

"Scope">是程序源代码的一个区域,它为变量和相关事物定义了一个容器。(有时它用来指结果的"对象";由规范定义,但更恰当地称为词法环境记录。)例如,这个源代码有两个显式作用域:

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

作用域为:

  • {}内定义函数体的函数作用域。
  • {}中的块作用域,在if上定义块。

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

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

最新更新