Javascript 为什么添加默认参数值会改变修改参数时的行为?

Javascript 为什么添加默认参数值会改变修改参数时的行为?,javascript,executioncontext,Javascript,Executioncontext,第一部分是: var a=1; 职能fn2(a){ 参数[0]=20; var a=22; 控制台日志(a); log(参数[0]); } fn2(a) 在MDN示例中,指向参数[0]的a具有默认值,而在我的问题中,不指向参数[0]的b具有默认值。这是两种不同的情况 至少存在一个rest/default/destructured参数,在这种情况下,对参数的任何标记的赋值都不会导致相关变量的更改,或者没有rest/default/destructured参数,在这种情况下,对参数的任何标记的所有

第一部分是:

var a=1;
职能fn2(a){
参数[0]=20;
var a=22;
控制台日志(a);
log(参数[0]);
}
fn2(a)
在MDN示例中,指向参数[0]的a具有默认值,而在我的问题中,不指向参数[0]的b具有默认值。这是两种不同的情况

至少存在一个rest/default/destructured参数,在这种情况下,对
参数的任何标记的赋值都不会导致相关变量的更改,或者没有rest/default/destructured参数,在这种情况下,对
参数的任何标记的所有赋值都将导致相关变量的更改

参数的每个索引
都将更改其关联的变量,或者都不会更改。因此,即使只有
b
arguments[1]
)有默认赋值,当
b
有默认赋值时,对
arguments[0]
的更改也会导致对
a
的更改

为什么这里有两个a?一个在街区,另一个在本地。那么哪一个是参数a呢?另一个a(不是参数)来自哪里

我很确定Chrome调试器很混乱,因为当
a
已经作为参数存在于作用域中时,您有
var a
。当变量为

(1) 在函数的顶层声明(使用
const
let
var
),或

(2) 用
const
let
在非功能块内声明


当作用域中已经存在
a
时,
a
前面的
var
是完全多余的。

@CertainPerformance再次查看它,因为一个“a”作为参数传递,被视为局部参数,而另一个是您在函数内部使用var创建的全局参数。这就是为什么有两个a。@dharmendra vaishnav在函数中创建的一个也应被视为局部变量。在第一节代码中,只有一个
a
。为什么?但在第二节代码中,当b具有默认赋值时,会更改为参数[0]不会导致a的更改。它们不会一起更改@CertainPerformance@Chor-是的。这就是您引用的材料所说的:“当非严格函数确实包含rest、default或destructured参数时,arguments对象中的值不会跟踪参数的值。相反,它们反映了调用函数时提供的参数”但另一个问题是,为什么在第二节代码中有2个
a
,而在第一节代码中只有一个
a
?在图中,我认为局部的
a
是初始参数
a
,它只是首先保持与参数[0]相同。然后是参数[0]更改为20。由于轨道丢失,此处的
a
仍将保持其值(1),但块中的
a
如何?它来自何处?当存在与参数同名的变量时,该变量不会影响参数。如果是,为什么块中有一个
a
变量?@Chor我很确定Chrome调试器很混乱,因为当
a
已经作为参数存在于作用域中时,您有
var a
。这很可能是一个错误。