请考虑以下代码段:
// 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);
函数token
的{{1}}参数可以为null或字符串。
调用者端的代码块定义变量令牌并将其设置为正确的值。
在调用者方面量化getData
变量的正确方法是什么?它应该是token
,let
还是const
?
答案 0 :(得分:1)
应为var
,使用let
和const
将生成变量块范围,并且仅存在于if
块中。使用const
也可以使用它,并且不会在将来更改它。
答案 1 :(得分:1)
你的问题有点令人困惑。
你在询问"来电者"方,但调用getData()
函数的代码的一侧清楚地将token
变量定义为var
已经在您的代码中。如果您希望在let
语句之前定义let token
来缩小范围以阻止范围,则可以使用if
。您不能在代码中使用let
代替var
,因为这只会在if
块中定义变量,但您希望在该块之外使用它。< / p>
使用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()内部:
如何定义(const
,let
或var
)您传递给getData()
的任何内容对函数参数如何在{{1}内工作完全没有影响}}。所以,如果你的问题确实存在,那么getData()
内部并不重要。 ES5和ES6中的函数参数总是可变的(如getData()
或var
),并且这不是当前语言中可更改的内容。它们是分配给您传递的值的单独变量,因此它们不会继承您传递的任何let
属性,并且它们的范围由新函数定义定义,因此它们的范围与之无关。传递的变量是const
,const
还是let
。
因此,如果您将var
函数声明为:
getData()
然后,function getData(theToken) {
}
是一个可变参数,没有办法让它成为theToken
。由于它基本上是在函数的顶层声明,因此const
和var
之间确实没有区别,所以它们之间并不重要,因为范围已经是整个函数它已经基本悬挂起来了。
在ES6中,有一些有趣的解决方法,例如:
let
可以通过直接访问function getData() {
const [theToken] = arguments;
// access theToken here as const
}
来覆盖它,但这肯定是故意的,而不是偶然的。
在调用者方面量化令牌变量的正确方法是什么?它应该是let,const还是var?
它可能是arguments[0]
或var
。由于它处于功能的最高范围并且已经悬挂,因此确实没有区别。如果你在精神上想要选择一个,那就说它像let
,因为它总是功能范围。
答案 2 :(得分:1)
为什么你不像这样编写代码:
// Set 'token' to have string value or null
let token = null;
if ("nextForwardToken" in event.queryStringParameters) {
token = event.queryStringParameters.nextForwardToken;
}
getData(token, callback);