9.6 参数
9.6.1 参数与本地可用变量
如果你使用 let
定义一个与参数名相同的变量,会抛出静态错误:
function func(arg) {
let arg; // static error: duplicate declaration of `arg`
}
如果在块中定义:
function func(arg) {
{
let arg; // shadows parameter `arg`
}
}
相比之下,var
定义与参数名相同的变量不会做任何处理。
function func(arg) {
var arg; // does nothing
}
function func(arg) {
{
// We are still in same `var` scope as `arg`
var arg; // does nothing
}
}
9.6.2 参数默认值与暂时性死区
如果参数有默认值,也会处于暂时性死区:
// OK: `y` accesses `x` after it has been declared
function foo(x=1, y=x) {
return [x, y];
}
foo(); // [1,1]
// Exception: `x` tries to access `y` within TDZ
function bar(x=y, y=2) {
return [x, y];
}
bar(); // ReferenceError
9.6.3 参数默认值无法访问函数内作用域
参数默认值的作用域被方法主体分离。那就意味着方法或者函数的参数默认值不能访问方法块内本地可用变量:
let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func()); // outer
}
bar();