第一部分是:
var a = 1;
function fn2(a) {
arguments[0] = 20;
var a = 22;
console.log(a);
console.log(arguments[0]);
}
fn2(a);
var a = 1;
function fn2(a, b = 100) {
arguments[0] = 20;
var a = 22;
console.log(a);
console.log(arguments[0]);
}
fn2(a);
arguments[0]
和a
,因为它们实际上都指向参数a
。然而,在第二段代码中(添加了另一个参数b
),最终输出的是22和20。我猜这与额外的参数b
有关,并查找了一些帖子。在MDN中,我找到了以下内容:
当非严格模式的函数包含rest、default或解构参数时,arguments对象中的值不会跟踪参数的值。相反,它们反映了调用函数时提供的参数。
以下是来自MDN的示例代码:
function func(a = 55) {
arguments[0] = 99; // updating arguments[0] does not also update a
console.log(a);
}
func(10); // 10
我知道这句话的意思,但是我的问题和这个例子不同。
在 MDN 的例子中,指向
arguments[0]
的是有默认值的a
,而在我的问题中,没有指向arguments[0]
的b
有一个默认值。这是两种不同的情况。我还在控制台上调试,并发现:
为什么这里有两个 a
?一个在块级作用域中,而另一个在局部作用域中。那么哪一个才是参数 a
?另一个不是参数的 a
来自哪里?
a
。为什么? - Chor