【问题标题】:Multiple left hand assignment in Backbone source – is it a micro-optimization?Backbone 源中的多个左手分配——它是一种微优化吗?
【发布时间】:2016-01-13 02:33:28
【问题描述】:

在阅读annotated Backbone source code时,我遇到了这样的作业:

var Events = Backbone.Events = {};

我了解发生了什么:将一个空对象分配给Backbone.Events,然后将其分配给Events

作业写成这样的原因是什么?

总的来说,我知道多个左手分配是一个坏主意,因为如果这样做:

var a = b = c = 1;

bc 被提升到全局命名空间,但在主干的情况下,Events 是一个局部变量,Backbone.Events 绑定到 Backbone 对象,所以这里没有范围污染 –它是否正确?

那么是这样写的,所以在Events 中获取Backbone.Events 的“副本”,因为对象总是在JavaScript 中通过引用传递?这意味着对Events 的更改也将适用于Backbone.Events,因为它实际上是同一个对象,但我没有看到任何优势,但也许我在这里错过了什么?也许这只是一条捷径?

var Events = {};
var Backbone.Events = {};

编辑:上面的例子实际上是错误的,我只是因为 Guffa 的回答才意识到这一点。

【问题讨论】:

  • "...因为对象总是在 JavaScript 中通过引用传递?"。是的。作者还定义了一个Events对象,这样源代码就更干净了。
  • @Vohuman 使用清洁器意味着您只需输入Events 而不是Backbone.Events
  • 是的。是好还是坏?答案是“主要基于意见”。
  • “因为对象总是通过引用传递” JavaScript 总是按值传递。对象表示为引用,所以在这种情况下,变量被分配a引用,而不是by引用。这是一个很大的区别,不幸的是太多人会出错。引用传递意味着我可以这样做:var a = 1; var b = a; a = 2;b 也将是 2。但这不是 JavaScript 的工作方式(对于任何值/数据类型)。如需更多信息,请参阅en.wikipedia.org/wiki/Evaluation_strategy
  • @FelixKling 谢谢,我确实从未听说过!您是否有任何来源可以找到此类内容的正确信息?

标签: javascript backbone.js scope variable-assignment


【解决方案1】:

那么是这样写的,所以在事件中获取 Backbone.Events 的“副本”,因为在 JavaScript 中对象总是通过引用传递?

这正是它的本质。这仅仅意味着通过在主干上有一个事件,您可以将其称为全局变量。例如,如果你这样做:

 Backbone.Events.testEvent = "just a quick proof of concept test";

您可以看到这也存在于Events 变量中,反之亦然。

更新答案

从文档主干实际上是使用这种变量来快速参考来自 Backbone 的事件或其他资源。

我认为在一行中使用multiple assignments 是一种不好的做法。

【讨论】:

  • “最好不要在项目中使用全局变量来“快速”访问”。代码没有在这里定义 global 变量。
【解决方案2】:

是的,Events 变量将指向与Backbone.Events 属性相同的对象。它是以下形式的缩写:

Backbone.Events = {};
var Events = Backbone.Events;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多