【发布时间】:2018-03-23 07:21:26
【问题描述】:
function func(x = y, y = 2) {
return [x, y];
}
func(); // ReferenceError: y is not defined
func(1); // [1, 2]
正如上面代码所暗示的,在函数参数范围内有一个隐藏的TDZ,这就解释了为什么下面的代码会失败:
function func(arg) {
let arg = 1; // SyntaxError: Identifier 'arg' has already been declared
}
所以函数参数应该用let声明,但让我困惑的是:
function func(arg) {
var arg = 1;
console.log(arg); // 1
}
这段代码运行良好。
为什么可以使用var 重新声明变量? Javascript如何声明函数参数?
编辑:
我确切地知道您不能使用 let 重新声明变量。这里的问题是函数参数是否使用let 声明,所以:
function func(arg) {
var arg = 1;
}
就像:
let arg; // arg parameter declares here
var arg = 1; // func body
为什么它可以无异常运行?
【问题讨论】:
-
var是旧语法,但let是新语法。这只是一个怪癖。 -
你不应该重新声明函数参数,它们在进入函数体时已经声明了。
-
@Pointy 我认为你是唯一理解这里问题的人,也许这是因为 V8 必须与 ES5 兼容。但仍然需要与真正进入 V8 的人确认。