var a = 0
// 参数有默认值的话,会形成作用域
function foo(a, b = function() {
a = 3
console.log('a4',a)
}) {
console.log('a1',a)
var a = 2
b()
console.log('a2',a)
}
foo()
console.log('a3',a)
试一下最后的输出结果是多少? 正确的结果是undefined,3,2,0因为在ECMA官网上函数的参数有默认值的时候,是有作用域的。比如这里的b函数的作用域
{
a = undefined
b = function(){
a = 3
console.log(a)
}
}
所以在执行b函数的过程中a会被赋值为3, 第一个输出是undefiend是因为在foo函数里面有相当于var a = undefined的定义,第一句console.log(a)输出为undefined 第二句出现var a = 2 然后在b函数的作用域里面有一次将a赋值为3,所以b函数执行结果为3,当执行到第二个console.log('a2',a)就相当于下面的代码
function(a=3,b = function(){a = 3 console.log('a4',a)}){
var a = 2
console.log('a2',a)
}
所以最后输出是2
最后函数外面的a输出为0 所以最后的结果是undefined,3,2,0