JavaScript 命名空间对象字面量

标签 javascript namespaces javascript-namespaces

我最近了解到 JavaScript 命名空间以及如何使用它们像其他流行的 OOP 语言一样创建命名空间。我对它们的声明方式感到困惑。例如,

var myNamespace = myNamespace || {};

创建名为 myNamespace 的命名空间(如果尚未创建)。如果已创建,只需将其传递到 var myNamespace 中即可。

我无法理解myNamespace || 是什么{} 确实如此。

myNamespace 一开始不是未定义的吗?您如何在 bool 表达式中比较它。

此外,对象字面量 {} 是如何工作的?它是否创建一个空对象并将其分配给 myNamespace 以用作命名空间?

我尝试寻找有关 SO 的答案,但是关于如何声明不同类型的命名空间的实践过于饱和。

最佳答案

虽然||最初是为了使用 bool 值,但它是以一种非常方便的方式实现的,允许它设置默认值:

function or(a, b) {
  if (a) return a
  else return b
}

您可以在脑海中对此进行测试,看看它是否适用于 bool 值:如果 atrue,则结果为 true,因此结果与a相同。如果afalse,则结果取决于b

JavaScript 中使用 var 进行变量声明的方式有点奇怪。您可以在同一范围内重新声明具有相同标识符的变量。所以代码的工作方式是:

  • 如果 myNamespace 已声明,您可以重新声明该变量,但尚未对其进行赋值。您可以从 myNamespace 的旧声明中获取值。该值被假定为真值,因此 || 将返回它。
  • 如果 myNamespace 尚未声明,则声明它,然后 myNamespace 将是 undefined,一个虚假值。因此 || 将返回第二个值,即 {},该值将分配给 myNamespace

分两个单独的步骤阅读它可能是有意义的:

//Declare the variable if it doesn't exist,
//without overwriting an existing value
var myNamespace
//Take the value of myNamespace (undefined if it didn't exist yet)
//and replace it with {} if it is falsy
myNamespace = myNamespace || {}

关于JavaScript 命名空间对象字面量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45621861/

相关文章:

rest - Blazegraph 通过 REST API 创建命名空间

javascript - 继承命名空间javascript

ruby-on-rails - 您如何在 Rails 3.1 中使用 Sprockets 编写干燥的模块化 CoffeeScript ?

XML XSD 递归和命名空间

JavaScript 窗口命名空间 - 我可以深入了解一下它在做什么吗?

javascript - 尝试在简单的 HTML 和 JavaScript Trivia 游戏上显示分数

javascript - 为什么方法引用不跟踪这个?

javascript - 布局组件(抽屉、工具栏等)不作为组件工作

javascript - Meteor框架免费服务器崩溃

.net - .NET 中的全局导入/使用别名