代码摘自es6入门
var x = 1;
function foo(x, y = function() { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo() // 3
x // 1
里面有这么一句话
函数foo内部又声明了一个内部变量x,该变量与第一个参数x由于不是同一个作用域
然后我修改了一下
var x = 1;
function foo(x, y = function() { x = 2; }) {
let x = 3; //修改了这
y();
console.log(x);
}
我的问题是既然不是同一作用域,为什么不能在内部用let声明x,
我知道不能let重复声明变量,但是解答说不是同一作用域
我的疑问及猜想:
难道预编译过程中不考虑当函数有默认参数时产生独立作用域,所以先判断了重复定义?
感觉很奇怪,个人感觉:编译器应该会将形参x应该会由let来声明它,这样才能突出产生了独立作用域
重新整理,之前说的还是错的,更正一下
foo的[[scope]]:
形参申明形式我认为是var x; let y = function () {x = 2}