Javascript如何声明函数参数?
正如上面的代码所暗示的,函数参数范围中有一个隐藏的TDZ,这解释了下面的代码失败的原因: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
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
还具有全局范围,其中aslet
和const
仅限于它们所处的范围。因此var
是传统语法,理想情况下您可能希望避免使用它
对于可以重新分配的变量,使用let
;对于常量,使用const
var
还具有全局作用域,其中aslet
和const
仅限于它们所在的作用域
函数参数范围中有一个隐藏的TDZ
是的。看看更多的例子
Javascript如何声明函数参数
作为参数-有关详细说明,请参阅。它们既不同于let
也不同于var
,它们有自己的语义。ES6引入了默认初始值设定项,为它们提供了与let
中相同的TDZ限制,以捕获更多的程序员错误
为什么可以使用var
重新声明变量
因为在ES5之前,重新声明变量并不是一种错误情况,需要保留这种行为,以免破坏web。它只能用于新功能,如let
和const
——或使用默认初始值设定项的参数列表,请尝试function x(bar,bar){}
vsfunction x(bar,bar=1){}
函数参数范围中有一个隐藏的TDZ
是的。看看更多的例子
Javascript如何声明函数参数
作为参数-有关详细说明,请参阅。它们既不同于let
也不同于var
,它们有自己的语义。ES6引入了默认初始值设定项,为它们提供了与let
中相同的TDZ限制,以捕获更多的程序员错误
为什么可以使用var
重新声明变量
因为在ES5之前,重新声明变量并不是一种错误情况,需要保留这种行为,以免破坏web。它只能用于新功能,如let
和const
——或使用默认初始值设定项的参数列表,请尝试函数x(bar,bar){}
vs函数x(bar,bar=1){}
参数绑定