【问题标题】:Javascript: Should an argument passed to a function be defined as 'let', 'const' or 'var'?Javascript:传递给函数的参数是否应该定义为“let”、“const”或“var”?
【发布时间】:2017-12-16 09:18:29
【问题描述】:

考虑以下代码sn-p:

// Set 'token' to have string value or null

if ("nextForwardToken" in event.queryStringParameters) {
  var token = event.queryStringParameters.nextForwardToken;
} else {
  var token = null;
}

getData(token, callback);

函数getDatatoken 参数可以是空值或字符串。

调用方的代码块定义变量token并将其设置为正确的值。

在调用方量化token 变量的正确方法是什么?应该是letconst 还是var

【问题讨论】:

  • 您是否尝试过将代码中的var 替换为letconst 时会发生什么?
  • 当然,包括三元运算符。只是想知道是否有一种惯用的 JS 方式来声明参数、有条件地设置其值并将其传递给函数。

标签: javascript node.js constants var let


【解决方案1】:

应该是var,使用letconst会使得变量块作用域并且只存在于if块中。使用const 也是不必要的,除非您会使用它并且以后不会更改它。

【讨论】:

  • constlet 存在相同的范围问题。
【解决方案2】:

你的问题有点混乱。

您询问的是“调用者”方面,但调用getData() 函数的代码方面清楚地将token 变量定义为var 已经在您的代码中。如果您在 if 语句之前定义了 let token,您可以使用 let 来缩小范围以阻止范围。您不能在代码中使用let 代替var,因为那样只会在if 块内定义变量,但您想在该块之外使用它。

使用 let:

所以,你可以像这样使用let

let token;
if ("nextForwardToken" in event.queryStringParameters) {
  token = event.queryStringParameters.nextForwardToken;
} else {
  token = null;
}
getData(token, callback);

如果这还不是顶级函数范围,那么使用let 会将范围缩小到仅父块。

使用 const:

您不能真正将此结构与const 一起使用,因为const 只能定义一次并且必须包含一个初始化程序。所以,如果你想使用const,那么你可以这样做:

const token = "nextForwardToken" in event.queryStringParameters ? event.queryStringParameters.nextForwardToken : null;
getData(token, callback);

当然,你甚至可以完全不使用临时变量:

getData("nextForwardToken" in event.queryStringParameters ? event.queryStringParameters.nextForwardToken : null, callback);

getData() 内部:

您如何定义(constletvar)无论您传递给 getData(),都不会影响函数参数在 getData() 中的工作方式。所以,如果你的问题真的是关于这个的,那么在getData() 内部并不重要。 ES5 和 ES6 中的函数参数始终是可变的(如 varlet),这在语言中目前是不可更改的。它们是单独的变量,分配给您传递的值,因此它们不会从您传递的值继承任何 const 属性,并且它们的范围由新函数定义定义,因此它们的范围与传递的变量是否无关是constletvar

所以,如果您将 getData() 函数声明为:

function getData(theToken) {

}

那么,theToken 是一个可变参数,没有办法使它成为 const。因为它本质上是在函数的顶层声明的,所以varlet 之间真的没有区别,所以它们之间并不重要,因为范围已经是整个函数并且它已经基本上被提升了。


在 ES6 中,可能有一些有趣的解决方法,例如:

function getData() {
    const [theToken] = arguments;

    // access theToken here as const

}

仍然可以通过直接访问arguments[0] 来覆盖它,但这肯定是有意的,而不是偶然的。

在调用方量化令牌变量的正确方法是什么?应该是 let、const 还是 var?

类似于varlet。由于它位于函数的顶级范围并且已经被提升,所以真的没有区别。如果你想选择一个,那么就说它就像var,因为它始终是函数范围的。

【讨论】:

  • 优秀的深刻答案,非常感谢。我使用 var 的方式是否有意义,还是应该先声明变量然后赋值?有什么惯用的 JS 推荐吗?
  • @AdamMatan - 重复 var 定义通常不好。虽然 JS 允许这样做,但它往往会导致阅读您的代码的人认为您正在声明一个新变量(事实上,它可能已经存在)并且它暗示了块作用域(尽管 var 是函数作用域)。因此,最好将var token 放在if 语句之前并分配变量(与我在let 示例中所做的相同)。
  • 完美。谢谢!
  • 没有量词的赋值呢?只需token =?
  • @AdamMatan - 永远不要分配给尚未声明的变量。这会创建一个隐式全局,这是一种非常糟糕的编码风格,可能导致编程事故。最常见的是在没有任何声明的情况下在for 循环中引用i,然后你想知道为什么你的for 循环中的函数在你调用它时会中断(这也做同样的事情并且他们会被击败彼此使用i)。因此,始终明确声明它varconstlet。而且,更好的是,在严格模式下运行,如果在没有先声明变量的情况下分配给变量,则会出错。
【解决方案3】:

为什么你不这样写你的代码:

// Set 'token' to have string value or null
let token = null;
if ("nextForwardToken" in event.queryStringParameters) {
  token = event.queryStringParameters.nextForwardToken;
}

getData(token, callback);

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 2013-11-08
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多