关于函数的参数作用域的一道面试题

195 阅读1分钟
        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