【问题标题】:Javascript For Loop with 2 sets of parenthesis (round brackets) - FOR ()()带有 2 组括号(圆括号)的 Javascript For 循环 - FOR ()()
【发布时间】:2021-11-19 10:06:08
【问题描述】:

我刚刚从某个地方得到了一个代码,我试图理解它。但是我卡在了一个我无法理解的地方。 Javascript代码如下:

for(t_var=0,n_var=i_var.length; t_var<n_var; t_var++)
  (e_var=i_var[t_var])[0]
    .removeEventListener(e_var[1],d_var)

这是一个单行 javascript for 循环。我无法理解第二组圆括号的使用,即包含 (e_var=i_var[t_var])。我认为它可能正在创建某种数组,因为第二组括号后的 [0] 将其显示为数组。但我不确定它的具体用途是什么?

有人可以帮忙吗?

问候

【问题讨论】:

  • for (...) { (e_var = i_var[t_var])[0].removeEventListener(...) },(e_var = i_var[t_var])[0]e_var = i_var[t_var]; e_var[0].removeEventListener(...)相同
  • "简单的赋值操作符 (=) 用于给变量赋值。赋值操作求值。"我>
  • i_var[t_var]赋值给e_var,所以removeEventListener(e_var[1],d_var)可以直接使用e_var
  • 它看起来像是分组运算符()的mssuse。

标签: javascript for-loop


【解决方案1】:

您可以按以下方式重写代码以使其更易于理解:

for(t_var=0,n_var=i_var.length; t_var<n_var; t_var++)(e_var=i_var[t_var])[0].removeEventListener(e_var[1], d_var);

// on multiple lines
for (t_var = 0, n_var = i_var.length; t_var < n_var; t_var++)
  (e_var = i_var[t_var])[0].removeEventListener(e_var[1], d_var);

// using a for-loop with curly brackets
for (t_var = 0, n_var = i_var.length; t_var < n_var; t_var++) {
  (e_var = i_var[t_var])[0].removeEventListener(e_var[1], d_var);
}

// splitting assignment and event listener removal
for (t_var = 0, n_var = i_var.length; t_var < n_var; t_var++) {
  e_var = i_var[t_var];
  e_var[0].removeEventListener(e_var[1], d_var);
  // ^ the expression `(e_var = i_var[t_var])` returns the value assigned to `e_var`
}

// removal of array length caching to make the loop more readable
for (t_var = 0; t_var < i_var.length; t_var++) {
  e_var = i_var[t_var];
  e_var[0].removeEventListener(e_var[1], d_var);
}

// more descriptive variable names
for (index = 0; index < array.length; index++) {
  arrayElement = array[index];
  arrayElement[0].removeEventListener(arrayElement[1], eventListener);
}

// using destructuring assignment
for (index = 0; index < array.length; index++) {
  arrayElement = array[index];
  const [htmlElement, eventType] = arrayElement;
  htmlElement.removeEventListener(eventType, eventListener);
}

// using for...of instead of standard for-loop
for (const [htmlElement, eventType] of array) {
  htmlElement.removeEventListener(eventType, eventListener);
}

请注意,您的示例未使用varletconst 来定义变量。除了我介绍的新变量之外,上面的更改也没有使用这些更改。通常变量应该总是使用 3 个关键字中的一个来定义(最好是 letconst),否则变量是全局的。全局变量通常会导致意外行为,从而导致错误。

【讨论】:

  • “删除数组长度缓存以使循环更具可读性” - 这种更改是无用的。在循环的标题中声明第二个变量是有充分理由的,尤其是 letconst
  • @Andreas 缓存长度的唯一充分理由是以下情况:您想使用原始数组长度,但循环改变了数组,导致其大小增加或缩小。然而,由于循环的内容不会改变数组大小(在呈现的场景中),我们可以安全地假设n_var 将始终与i_var.length 相同。这意味着缓存该值只会引入视觉复杂性,导致代码可读性降低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多