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
。这很可能是一个错误。