一:函数参数作用域

1
2
3
4
5
6
function test(x, y = function () { x = 2;}) {  
var x = 3;
y();
console.log(x);
}
test();//3

1
2
3
4
5
6
function test(x, y = function () { x = 2;}) {  
x = 3;
y();
console.log(x);
}
test();//2

函数体是函数参数的子域,即类似于下面这种结构:

1
2
3
4
5
6
7
8
{  
var x, y = function () { x = 2;}
{
(var) x = 3;
y();
console.log(x);
}
}

当函数体内通过var再次声明x时,会将外层x覆盖;执行y()时,因为参数作用域在函数体的外面,无法访问内层变量,此时访问的是参数作用域的x,即将x由undefined赋值为2;而最终函数体内打印的是函数体内再次声明的变量x,值为3。
当函数体内的x变量前没有var时,此时修改的是参数作用域内的变量x,y()中将x修改为2,因此最终打印的值为2。