Javascript:传递给函数的参数应该定义为 'let'、'const' 还是 'var'?

Javascript: Should an argument passed to a function be defined as 'let', 'const' or 'var'?

考虑以下代码片段:

// 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 参数可以为 null 或字符串。

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

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

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

你的问题有点混乱。

你问的是"caller"这边,但是调用getData()函数的代码那一边明确定义了token变量为var已经对了在你的代码中。如果您在 if 语句之前定义了 let token,那么如果您想将范围缩小到块范围,则可以使用 let。您不能在代码中使用 let 代替 var,因为那样只会在 if 块内定义变量,但您想在该块外使用它。

使用让:

因此,您可以像这样使用 let

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

如果这还没有在顶层函数范围内,那么使用 let 会将范围缩小到父块。

使用常量:

您不能真正将此结构与 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] 来覆盖它,但这肯定是有意的,而不是偶然的。

What's the right way to quantify the token variable on the caller side? Should it be let, const or var?

就像 varlet。因为它在函数的顶部范围并且已经被提升,所以真的没有区别。如果你在心理上想选择一个,那就说它像 var 因为它总是函数范围。

为什么你不这样简单地编写代码:

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

getData(token, callback);