【问题标题】:Are default arguments in functions an equal alternative for local variable declarations?函数中的默认参数是否可以替代局部变量声明?
【发布时间】:2020-10-27 23:59:07
【问题描述】:

注意:这是关于声明 LOCAL 变量(函数范围的变量)。

我刚刚意识到,当我有一个我可以控制其调用者的 JavaScript 函数(例如不是公共 API)时,我可以“安全地”简化 local的声明和分配> 变量并同时摆脱var/const/let

该方法利用默认函数参数来 a) 声明一个函数范围的变量 b) 甚至分配它:

// BEFORE
function createDashes(count) {
  let dash ="-";            // declare a variable for use in the function
  for (let i=0; i < count; i++) {
    dash += "-";
  }
  return dash;
}
console.log(createDashes(5)); // "-----"

// AFTER
function createDashes(count, dash="-") {
  for (let i=0; i < count; i++) {
    dash += "-";
  }
  return dash;
}
console.log(createDashes(5)); // "-----"

总的来说,通过这种技术,我们可以声明任意(但固定)数量的变量,无论是否赋值:

// var0 - var2 are variables without assignments (i.e. initialized to undefined)
// var3 - var4 are variables with assignments (must come after the previous ones!)
function foo(actualParameter, var0, var1, var2, var3="x", var4="y") {
  // ...
}

使用这种技术也不会降低性能。

问题:这种方法有什么限制或限制?

Reading through the MDN:

函数参数是一个可访问的类数组对象 内部函数包含传递给该函数的参数值。

arguments 对象 是一个局部变量,可在所有 非箭头函数。您可以在里面引用函数的参数 该函数通过使用其参数对象。它有每个条目 调用函数的参数,第一个条目的索引为 0.

【问题讨论】:

  • 你怎么知道没有性能损失?你咨询过 JS VM 的实现吗?我还认为,也许除了破折号函数之外的示例会更好。从那里开始,您甚至不需要一个变量来保存"-"。此外,您可以将其整体简化为const creatDashes = "-".repeat,从而破坏您的示例目的:)
  • 我同意@ComFreek。这个例子只是一个坏例子。
  • @ComFreek。您的编辑非常有用。谢谢你。

标签: javascript arrays variables global-variables hoisting


【解决方案1】:

正如您已经说过的那样,这种技术的主要限制是必须“小心不要被不正确的函数调用错误地覆盖此类变量”。也不清楚哪些函数参数是可选参数,哪些是局部变量。在记录函数签名或重构代码时,您也会遇到困难。

与许多允许使用更短语法的技术一样,它对打高尔夫球很有好处,但会导致代码不可读、难以维护和单调。

【讨论】:

  • 谢谢@Bergi。我同意。不过,了解并记住这一点很有趣。
  • 这是一个相当的standard technique in code golf afaict。但实际上没有其他应用程序需要避免正常的变量声明。
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 2014-05-30
  • 2011-08-16
  • 2016-07-03
  • 2023-03-24
  • 2022-01-11
  • 1970-01-01
  • 2020-03-01
相关资源
最近更新 更多