![](/img/trans.png)
[英]JavaScript inner lambda function without var, let or const
[英]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);
函数getData
的token
参数可以是null或字符串。
调用者端的代码块定义变量令牌并将其设置为正确的值。
在调用者端量化token
变量的正确方法是什么? 它应该是let
, const
还是var
?
它应该是var
,使用let
和const
将产生变量块作用域,并且只存在于if
块中。 使用const
也是你使用它的不必要的例外,并且将来不会改变它。
你的问题有点令人困惑。
你问有关“来电者”的一面,但正在调用的代码侧getData()
函数明确定义token
变量var
已经正确的,在你的代码。 如果要在if
语句之前定义let token
, if
可以使用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()里面:
如何定义( const
, let
或var
)传递给getData()
任何内容对函数参数在getData()
工作方式完全没有影响。 所以,如果您的问题确实存在,那么getData()
内部并不重要。 ES5和ES6中的函数参数总是可变的(如var
或let
),并且这不是当前语言中可更改的内容。 它们是分配给您传递的值的单独变量,因此它们不会从您传递的内容继承任何const
属性,并且它们的范围由新函数定义定义,因此它们的范围与传递的变量是否为const
无关, let
或var
。
因此,如果您将getData()
函数声明为:
function getData(theToken) {
}
然后, theToken
是一个可变参数,没有办法使它成为const
。 因为它基本上是在函数的顶层声明的,所以var
和let
之间确实没有区别所以它们之间并不重要,因为范围已经是整个函数并且它已经基本上被提升了。
在ES6中,有一些有趣的解决方法,例如:
function getData() {
const [theToken] = arguments;
// access theToken here as const
}
人们仍然可以通过直接访问arguments[0]
覆盖它,但这肯定是有意的,而不是偶然的。
在调用者端量化令牌变量的正确方法是什么? 它应该是let,const还是var?
这就像var
或let
。 由于它处于功能的最高范围并且已经悬挂,因此确实没有区别。 如果你在心理上想要选择一个,那就说它就像var
一样,因为它总是功能范围。
为什么你不像这样写代码:
// Set 'token' to have string value or null
let token = null;
if ("nextForwardToken" in event.queryStringParameters) {
token = event.queryStringParameters.nextForwardToken;
}
getData(token, callback);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.