Javascript如何声明函数参数?

Javascript如何声明函数参数?,javascript,ecmascript-6,Javascript,Ecmascript 6,正如上面的代码所暗示的,函数参数范围中有一个隐藏的TDZ,这解释了下面的代码失败的原因: function func(x = y, y = 2) { return [x, y]; } func(); // ReferenceError: y is not defined func(1); // [1, 2] 所以函数参数应该用let声明,但让我困惑的是: function func(arg) { let arg = 1; // SyntaxError: Identifier

正如上面的代码所暗示的,函数参数范围中有一个隐藏的TDZ,这解释了下面的代码失败的原因:

function func(x = y, y = 2) { 
    return [x, y];
}

func(); // ReferenceError: y is not defined
func(1); // [1, 2]
所以函数参数应该用
let
声明,但让我困惑的是:

function func(arg) {
    let arg = 1; // SyntaxError: Identifier 'arg' has already been declared
}
这段代码运行良好

为什么可以使用
var
重新声明变量?Javascript如何声明函数参数


编辑: 我完全知道不能使用let重新声明变量。这里的问题是,如果函数参数是使用
let
声明的,那么:

function func(arg) {
    var arg = 1;
    console.log(arg); // 1
}
就像:

function func(arg) {
    var arg = 1;
}

为什么可以无异常运行呢?

如果将参数传递给
func
调用,则第一个示例不会抛出错误值


var
的作用域与
let
const
的作用域不同。如果将参数传递给
func
调用,则第一个示例不会抛出错误值


var
let
const
let
的作用域不同,最近添加了
var
,并引入了一个错误抛出,当您尝试声明两次涉及
let
的变量时会出现该错误抛出。除非变量已经用
let
声明,否则
var
不会发生这种情况,它将简单地替换旧值

let arg; // arg parameter declares here
var arg = 1; // func body 

此处是指向的链接,该链接解释了该功能。

let
是最近添加的,在尝试声明两次涉及
let
的变量时,引入了一个错误抛出。除非变量已经用
let
声明,否则
var
不会发生这种情况,它将简单地替换旧值

let arg; // arg parameter declares here
var arg = 1; // func body 

此处是指向的链接,用于解释该功能。

这不一定与函数的参数有关

这也将抛出一个错误:

函数func(){
var arg=1;
设arg=2
console.log(arg);//1
}

func()这不一定与函数的参数相关

这也将抛出一个错误:

函数func(){
var arg=1;
设arg=2
console.log(arg);//1
}

func()原因是,JavaScript社区的人们在执行
var arg=1
时将其称为“提升”,并将其翻译为
var arg
arg=1但是,如果由于函数参数的原因,var已经被定义为这里的情况,那么编译器将尝试提供帮助,并忽略后续的重新声明,而不是抛出错误。。。这可能是一个意外的行为,新的let变量声明没有遵循这一点,但是,出于向后兼容性的原因,它必须保持在那里。

原因是,JavaScript社区的人们称之为“提升”当您执行
var arg=1
时,它将被转换为
var arg
arg=1但是,如果由于函数参数的原因,var已经被定义为这里的情况,那么编译器将尝试提供帮助,并忽略后续的重新声明,而不是抛出错误。。。这可能是一个意外的行为,新的let变量声明没有遵循这一点,但是,出于向后兼容性的原因,它必须保留在那里。

因此
var
是传统语法,理想情况下,您可能希望避免使用它

对于可以重新分配的变量,使用
let
;对于常量,使用
const


var
还具有全局范围,其中as
let
const
仅限于它们所处的范围。

因此
var
是传统语法,理想情况下您可能希望避免使用它

对于可以重新分配的变量,使用
let
;对于常量,使用
const

var
还具有全局作用域,其中as
let
const
仅限于它们所在的作用域

函数参数范围中有一个隐藏的TDZ

是的。看看更多的例子

Javascript如何声明函数参数

作为参数-有关详细说明,请参阅。它们既不同于
let
也不同于
var
,它们有自己的语义。ES6引入了默认初始值设定项,为它们提供了与
let
中相同的TDZ限制,以捕获更多的程序员错误

为什么可以使用
var
重新声明变量

因为在ES5之前,重新声明变量并不是一种错误情况,需要保留这种行为,以免破坏web。它只能用于新功能,如
let
const
——或使用默认初始值设定项的参数列表,请尝试
function x(bar,bar){}
vs
function x(bar,bar=1){}

函数参数范围中有一个隐藏的TDZ

是的。看看更多的例子

Javascript如何声明函数参数

作为参数-有关详细说明,请参阅。它们既不同于
let
也不同于
var
,它们有自己的语义。ES6引入了默认初始值设定项,为它们提供了与
let
中相同的TDZ限制,以捕获更多的程序员错误

为什么可以使用
var
重新声明变量

因为在ES5之前,重新声明变量并不是一种错误情况,需要保留这种行为,以免破坏web。它只能用于新功能,如
let
const
——或使用默认初始值设定项的参数列表,请尝试
函数x(bar,bar){}
vs
函数x(bar,bar=1){}
参数绑定