3

我试图更好地掌握 JS 语法,我想知道为什么许多库中的常见做法是在已声明具有相同名称的变量之后重复对象名称。请看下面:

var Backbone = Backbone || {};    // <= Why the duplication?

或者

var listeners = this._listeners || (this._listeners = {});

更新:

经过进一步研究,我发现了一篇写得很好的文章,它评估了许多惯用语。

文章还解释了立即调用函数表达式 (IIFE) 背后的用法,即将函数包装在函数中,如下所示:

(function() {
  console.log('Hello!');
})();

这是像我这样的新手不能完全理解的另一种 JS 脑筋急转弯。

4

3 回答 3

9
var Backbone = Backbone || {};

表示如果Backboneundefinednullfalse,将其设置为{}


更长的解释:

赋值运算符从右到计算,逻辑运算符(即使 Javascript 没有真正的逻辑运算符,因为它们也适用于布尔操作数)从左到右计算

类似的表达式A || B返回Bif Ais undefined, null, or false

因此,如果它已经有一个值,则A = A || B要么保留值,要么分配给.ABA

于 2013-04-25T12:39:57.910 回答
0
var Backbone = Backbone || {};

正如其他人所解释的,此代码将执行以下操作:

  • 声明一个变量Backbone,检查变量Backbone是否已经存在于范围内,
  • 如果是,则将该对象(在 JS 中一切都是对象)分配给我们声明的变量(顺便提一下,该变量具有相同的名称)
  • 如果没有,它将创建一个新的空对象。

这样做的目的是模块化。假设您正在加载几个 Backbone 插件,以及裸 Backbone。

  • 首先,您加载了基础主干。
  • 该脚本检查根范围对象是否检查根范围对象Backbone是否存在(即window.Backbone)
  • 它没有,所以我们创建一个空的并用它做一些事情。
  • 现在,下一个插件脚本检查根对象 Backbone 是否存在(它确实存在)
  • 由于它确实存在,它不会创建一个新的空对象,而是使用现有的
  • 现在它是这样的,直到你所有的插件都被加载。

这并不完全正确,但会发生类似的事情。

于 2013-04-25T12:59:21.447 回答
-1

这是一种仅在尚未分配变量时才默认变量值的方法。您可以将其视为 JS 使用默认值执行可选函数参数的方式。

于 2013-04-25T12:40:45.050 回答