var x = 1;
function foo(x, y = function() { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo() // 3
x // 1
如果y赋值的函数是外部定义的话,最后的全局x为什么是 1;
如果y赋值的函数是内部定义的话,foo()为什么会打印 3;
var x = 1;
function foo(x, y = function() { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo() // 3
x // 1
如果y赋值的函数是外部定义的话,最后的全局x为什么是 1;
如果y赋值的函数是内部定义的话,foo()为什么会打印 3;
题主你需要好好了解一下 ES6 的函数参数默认值。推荐一本书:《深入理解ES6》。
在 ES6 里,参数默认值等效于直接展开:
function foo(x, y = 0) {....}
// =
function foo(x, y) {
if (y === undefined) { y = 0 }
....
}
所以你的代码就等效于:
var x = 1;
function foo(x, y) {
var x = 3;
if (y === undefined) {
y = function() { x = 2; }
}
y();
console.log(x);
}
foo() // 3
x // 1
因为你在函数内部使用了 var x = 2;
,所以 y()
操作的实际是闭包内部的 x
,所以不会影响到闭包外面的 x
。
嗨,你的观察是正确的。这个作用域既不是“外”也不是“内”,而是夹在中间的作用域,这是为了防止默认参数被函数内部的变量污染。