Javascript 为什么可以';我声明了一个let变量,它与Chrome中的函数体同名

Javascript 为什么可以';我声明了一个let变量,它与Chrome中的函数体同名,javascript,Javascript,Chrome67(本文撰写时的最新版本)让我可以做到这一点 function foo(x, y) { var x = 5; console.log(x, y); } foo(1,2); // prints 5 2 但不是这个 function foo(x, y) { let x = 5; console.log(x, y); } foo(1,2); // Throws a SyntaxError: Identifier 'x' has already been

Chrome67(本文撰写时的最新版本)让我可以做到这一点

function foo(x, y) {
    var x = 5;
    console.log(x, y);
}
foo(1,2);
// prints 5 2
但不是这个

function foo(x, y) {
    let x = 5;
    console.log(x, y);
}
foo(1,2);
// Throws a SyntaxError: Identifier 'x' has already been declared

这个行为标准定义了吗?

使用旧的
var
关键字,您可以自由多次声明变量,而不会出现问题(嗯……这本身就是一个问题)


const
关键字具有更好的行为。在您的情况下:您不需要重新声明
x
,因为它已经声明为
foo
函数的参数,所以您可以直接为它赋值(重写参数不是很干净,而是合法的).

使用旧的
var
关键字,您可以自由多次声明变量,而不会出现问题(嗯……这本身就是一个问题)


const
关键字具有更好的行为。在您的例子中:您不需要重新声明
x
,因为它已经声明为
foo
函数的一个参数,所以您可以直接为它赋值(重写参数不是非常干净的,而是合法的)。

如果您添加
“使用strict”在顶部,第一个案例也将失败。是的,这种行为是标准定义的。不能让
let
s或
const
s重新声明参数;var x而非
让x;如果您添加了
“使用strict”,则设x
在顶部,第一个案例也将失败。是的,这种行为是标准定义的。不能让
let
s或
const
s重新声明参数;var x而非
让x;谢谢你,卢卡。函数声明开头的大括号不应该创建一个新的作用域,从而允许我在内部作用域中重新定义x吗?例如,下面的操作没有错误
函数foo(x,y){let a=5;{let a=6;console.log(a);};foo(1,2)
是的,但是
x
已经在该范围内,因为它是函数参数之一,所以在范围内考虑它自己谢谢你,卢卡。函数声明开头的大括号不应该创建一个新的作用域,从而允许我在内部作用域中重新定义x吗?例如,下面的操作没有错误
函数foo(x,y){let a=5;{let a=6;console.log(a);};foo(1,2)
是,但是
x
已经在该范围内,因为它是函数参数之一,所以在范围内考虑