【发布时间】:2019-04-18 08:32:52
【问题描述】:
第一部分是:
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);
我可以理解为什么在第一段代码中它最终会输出 22 和 22,因为 arguments[0] 和 a 实际上都指向参数a。
但是,在第二段代码中(添加了另一个参数b),它最终输出了22和20。我猜这与额外的参数b有关,并搜索了一些帖子。在 MDN 中,我发现:
当非严格函数确实包含 rest、default 或 destructured 参数,则参数对象中的值不跟踪 参数的值。相反,它们反映了提供的论点 当函数被调用时
这是来自 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具有默认值.这是两种不同的条件。我也在控制台调试,发现:
为什么这里有 2 个a?一个在街区,另一个在本地。那么参数a究竟是哪一个呢?另一个a(不是参数)来自哪里?
【问题讨论】:
-
@CertainPerformance 再看一遍
-
因为一个 'a' 作为参数传递,它被认为是本地的,而另一个是您使用全局的 var 在函数内部创建的。这就是为什么有两个 a。
-
@dharmendra vaishnav 在函数内部创建的也应该被视为局部变量。而在第一节代码中,只有一个
a。为什么?
标签: javascript executioncontext