【问题标题】:Why is this method of variable assignment causing issues?为什么这种变量赋值方法会引起问题?
【发布时间】:2020-12-18 02:34:30
【问题描述】:

这种类型的变量赋值是如何进行的(它在对象内部,所以“this”变量指的是所述对象):

var prop       = this.properties;
var properties = this.properties;

与此不同?

var prop = properties = this.properties;

当我更改为后者时,它引起了问题。是引用问题吗?

【问题讨论】:

  • “当我改为后者时,它引起了问题。它是一个引用问题吗?” - 我们应该如何在没有任何错误消息或minimal reproducible example 的情况下回答这个问题重现问题?
  • 在“松散”的 javascript 中可能工作......在“严格”的 javascript 中它不会,除非在该代码之前声明 properties - 我猜最排序的代码是 var prop = this.properties, properties = prop

标签: javascript variables reference


【解决方案1】:

不同之处在于,对于第二个,您尝试分配给您尚未声明的properties 变量。 var 仅适用于prop,不适用于properties,因为properties 位于= 的右侧,位于prop 之后,因此它是prop 的初始化程序的一部分。以下是它的分组方式:

var prop = (properties = this.properties);
//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^−−−− initializer for `prop`

在松散模式下,这意味着你会成为我所说的 The Horror of Implicit Globals 的牺牲品——它会创建一个名为 properties 的全局。在strict mode 中,分配给未声明的标识符是它应该一直存在的错误。 (所有新代码都应该使用严格模式编写。)

您可以使用var 等声明多个变量,但您不能使用相同的值源将它们全部分配(无需重复)。

你可以这样做:

var prop, properties;
prop = properties = this.properties;

如果你喜欢。或者:

var prop = this.properties, properties = prop;

之所以有效,是因为var(或let或const)中带有多个声明的初始化程序是按源代码顺序从左到右执行的,所以prop = this.properties发生在properties = prop之前。


旁注:var 不应在新代码中使用,请使用 let 或 const。 (如果你必须支持过时的 JavaScript 引擎,你可以将现代代码转译为 ES5。)

【讨论】:

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