先看一个例子:
var x = 0
function foo(x, y = function () { x = 1; console.log(x) }) {
console.log(x)
var x = 2
y()
console.log(x)
}
foo(3)
console.log(x)
在公布答案前, 先看一下ECMAScript官网上的一段解释:
大概意思就是:如果函数的参数没有默认值,那么形参和函数体内的声明在同一个环境记录中,如果函数的参数有默认值,将会为函数体内的声明重新创建一条环境记录
也就是:如果函数参数没有默认值,就只有一个函数作用域,如果函数参数有默认值,函数的参数就会形成一个作用域,保存参数的值
所以,上面例子中,一共有三个作用域,全局作用域、参数作用域、函数作用域,
这里的关键点是参数y这个函数中的x=1改变的是哪里的x?
是全局中的 x 还是函数体中的 x 还是参数 x
答案是参数中的 x , 参数 y 有默认值会形成一个作用域